- ·上一篇文章:基于UDP、TCP协议的C#网络编程
- ·下一篇文章:使用C#设计一个简单的抓网络页面的程序
C#网络编程之TCP的使用
TcpClient tcpClient = new TcpClient();//创建TcpClient对象实例 Try{ tcpClient.Connect("www.tuha.net",4088);//尝试与远程主机相连 } catch(Exception e){ MessageBox.Show("连接错误:"+e.Message); } try{ NetworkStream stream=tcpClient.GetStream();//获取网络传输流 } catch(Exception e) { MessageBox.Show("TcpClient错误:"+e.Message); } |
通过以上方法得到NetworkStream网络流之后,你就可以使用标准流读写方法Write和Read来发送和接受数据了。
:2010-10-10 07:36:02
以上是.Net下使用TcpClient类实现客户端编程的技术资料,为了向客户端提供这些服务,我们还需要编制相应的服务端程序,前一篇《Visual C#.Net网络程序开发-Socket篇》上曾经提到, Socket作为其他网络协议的基础,既可以面向客户端开发,也可以面向服务端开发,在传输层面上使用较多,而在应用协议层面上,客户端我们采用构建于Socket类之上的TcpClient取代Socket;相应地,构建于Socket之上的TcpListener提供了更高理念级别的 TCP 服务,使得我们能更方便地编写服务端应用程序。正是因为这样的原因,像FTP 和 HTTP 这样的应用层协议都是在 TcpListener 类的基础上建立的。
.Net中的TCPListener 用于监视TCP 端口上的传入请求,通过绑定本机IP地址和相应端口(这两者应与客户端的请求一致)创建TcpListener对象实例,并由Start方法启动侦听;当TcpListener侦听到用户端的连接后,视客户端的不同请求方式,通过AcceptTcpClient 方法接受传入的连接请求并创建 TcpClient 以处理请求,或者通过AcceptSocket 方法接受传入的连接请求并创建 Socket 以处理请求。最后,你需要使用 Stop 关闭用于侦听传入连接的 Socket,你必须也关闭从 AcceptSocket 或 AcceptTcpClient 返回的任何实例。这个过程详细解说如下:
首先,创建TcpListener对象实例,这通过TcpListener类的构造方法来实现:
public TcpListener(port);//指定本机端口 public TcpListener(IPEndPoint)//指定本机终结点 public TcpListener(IPAddress,port)//指定本机IP地址及端口 |
以上方法中的参数在前面多次提到,这里不再细述,唯一需要提醒的是,这些参数均针对服务端主机。下面的示例演示创建 TcpListener 类的实例:
IPHostEntry ipInfo=Dns.Resolve("127.0.0.1");//主机信息 IPAddressList[] ipList=ipInfo.IPAddressList;//IP数组 IPAddress ip=ipList[0];//IP try{ TcpListener tcpListener = new TcpListener(ipAddress, 4088);//创建TcpListener对象实例以侦听用户端连接 } catch ( Exception e){ MessageBox.Show("TcpListener错误:"+e.Message); } |
随后,你需要调用Start方法启动侦听:
public void Start();
其次,当侦听到有用户端连接时,需要接受挂起的连接请求,这通过调用以下两方法之一来完成连接:
public Socket AcceptSocket(); public TcpClient AcceptTcpClient(); |
前一个方法返回代表客户端的Socket对象,随后可以通过Socket 类的 Send 和 Receive 方法与远程计算机通讯;后一个方法返回代表客户端的TcpClient对象,随后使用上面介绍的 TcpClient.GetStream 方法获取 TcpClient 的基础网络流 NetworkStream,并使用流读写Read/Write方法与远程计算机通讯。
最后,请记住关闭侦听器:public void Stop();
同时关闭其他连接实例:public void Close();
下面的示例完整体现了上面的过程:
bool done = false; TcpListener listener = new TcpListener(13);// 创建TcpListener对象实例(13号端口提供时间服务) listener.Start();//启动侦听 while (!done) {//进入无限循环以侦听用户连接 TcpClient client = listener.AcceptTcpClient();//侦听到连接后创建客户端连接TcpClient NetworkStream ns = client.GetStream();//得到网络传输流 byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());//预发送的内容(此为服务端时间)转换为字节数组以便写入流 try { ns.Write(byteTime, 0, byteTime.Length);//写入流 ns.Close();//关闭流 client.Close();//关闭客户端连接 } catch (Exception e) { MessageBox.Show("流错误:"+e.Message) } |
综合运用上面的知识,下面的实例实现了简单的网络通讯-双机互连,针对客户端和服务端分别编制了应用程序。客户端创建到服务端的连接,向远程主机发送连接请求连接信号,并发送交谈内容;远程主机端接收来自客户的连接,向客户端发回确认连接的信号,同时接收并显示客户端的交谈内容。在这个基础上,发挥你的创造力,你完全可以开发出一个基于程序语言(C#)级的聊天室!
客户端主要源代码:
public void SendMeg()//发送信息 { try { int port=Int32.Parse(textBox3.Text.ToString());//远程主机端口 try { tcpClient=new TcpClient(textBox1.Text,port);//创建TcpClient对象实例 } catch(Exception le) { MessageBox.Show("TcpClient Error:"+le.Message); } string strDateLine=DateTime.Now.ToShortDateString()+" "+DateTime.Now.ToLongTimeString();//得到发送时客户端时间 netStream=tcpClient.GetStream();//得到网络流 sw=new StreamWriter(netStream);//创建TextWriter,向流中写字符 string words=textBox4.Text;//待发送的话 string content=strDateLine+words;//待发送内容 sw.Write(content);//写入流 sw.Close();//关闭流写入器 netStream.Close();//关闭网络流 tcpClient.Close();//关闭客户端连接 } catch(Exception ex) { MessageBox.Show("Sending Message Failed!"+ex.Message); } textBox4.Text="";//清空 } |
服务器端主要源代码:
public void StartListen()//侦听特定端口的用户请求 { //ReceiveMeg(); isLinked=false; //连接标志 try { int port=Int32.Parse(textBox1.Text.ToString());//本地待侦听端口 serverListener=new TcpListener(port);//创建TcpListener对象实例 serverListener.Start(); //启动侦听 } catch(Exception ex) { MessageBox.Show("Can‘t Start Server"+ex.Message); return; } isLinked=true; while(true)//进入无限循环等待用户端连接 { try { tcpClient=serverListener.AcceptTcpClient();//创建客户端连接对象 netStream=tcpClient.GetStream();//得到网络流 sr=new StreamReader(netStream);//流读写器 } catch(Exception re) { MessageBox.Show(re.Message); } string buffer=""; string received=""; received+=sr.ReadLine();//读流中一行 while(received.Length!=0) { buffer+=received; buffer+="\r\n"; //received=""; received=sr.ReadLine(); } listBox1.Items.Add(buffer);//显示 //关闭 sr.Close(); netStream.Close(); tcpClient.Close(); } } |
!
C#网络编程之TCP的使用