牐犎缓笤诵锌突Ф顺绦颍客户端首先发送连接请求到服务器端,服务器端回应后发送当前时间到客户端,这是客户端程序的截图:
牐牱⑺屯瓿珊螅服务器端继续等待下一次连接:
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)牐犕ü这个例子我们可以了解TcpClient类的基本用法,要使用这个类,必须使用System.Net.Socket命名空间,本例用到的三个命名空间如下:
牐爑sing System;
牐爑sing System.Net.Sockets;
牐爑sing System.Text;//从字节数组中获取字符串时使用该命名空间中的类
牐犑紫忍致垡幌驴突Ф顺绦颍开始我们必须初始化一个TcpClient类的实例:
牐燭cpClient client = new TcpClient(hostName, portNum);
牐犎缓笫褂肨cpClient类的GetStream()方法获取数据流,并且用它初始化一个NetworkStream类的实例:
牐燦etworkStream ns = client.GetStream();
牐犠⒁猓当使用主机名和端口号初始化TcpClient类的实例时,直到跟服务器建立了连接,这个实例才算真正建立,程序才能往下执行。如果因为网络不通,服务器不存在,服务器端口未开放等等原因而不能连接,程序将抛出异常并且中断执行。
牐牻立数据流之后,我们可以使用NetworkStream类的Read()方法从流中读取数据,使用Write()方法向流中写入数据。读取数据时,首先应该建立一个缓冲区,具体的说,就是建立一个byte型的数组用来存放从流中读取的数据。Read()方法的原型描述如下:
牐爌ublic override int Read(in byte[] buffer,int offset,int size)
牐燽uffer是缓冲数组,offset是数据(字节流)在缓冲数组中存放的开始位置,size是读取的字节数目,返回值是读取的字节数。在本例中,简单地使用该方法来读取服务器反馈的信息:
牐燽yte[] bytes = new byte[1024];//建立缓冲区
牐爄nt bytesRead = ns.Read(bytes, 0, bytes.Length);//读取字节流
牐犎缓笙允镜狡聊簧希
牐燙onsole.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));
牐犠詈蟛灰忘记关闭连接:
牐燾lient.Close();
牐犗旅媸潜纠完整的程序清单:
牐
using System;牐爑sing System.Net.Sockets;牐爑sing System.Text;牐爊amespace TcpClientExample牐爗牐牐牐爌ublic class TcpTimeClient牐牐牐爗牐牐牐牐牐爌rivate const int portNum = 13;//服务器端口,可以随意修改牐牐牐牐牐爌rivate const string hostName = "127.0.0.1";//服务器地址,127.0.0.1指本机牐牐牐牐牐燵STAThread]牐牐牐牐牐爏tatic void Main(string[] args)牐牐牐牐牐爗牐牐牐牐牐牐牐爐ry牐牐牐牐牐牐牐爗牐牐牐牐牐牐牐牐牐燙onsole.Write("Try to connect to "+hostName+":"+portNum.ToString()+"rn");牐牐牐牐牐牐牐牐牐燭cpClient client = new TcpClient(hostName, portNum);牐牐牐牐牐牐牐牐牐燦etworkStream ns = client.GetStream();牐牐牐牐牐牐牐牐牐燽yte[] bytes = new byte[1024];牐牐牐牐牐牐牐牐牐爄nt bytesRead = ns.Read(bytes, 0, bytes.Length);牐牐牐牐牐牐牐牐牐燙onsole.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));牐牐牐牐牐牐牐牐牐燾lient.Close();牐牐牐牐牐牐牐牐牐燙onsole.ReadLine();//由于是控制台程序,故为了清楚的看到结果,可以加上这句牐牐牐牐牐牐牐爙牐牐牐牐牐牐牐燾atch (Exception e)牐牐牐牐牐牐牐爗牐牐牐牐牐牐牐牐牐燙onsole.WriteLine(e.ToString());牐牐牐牐牐牐牐爙牐牐牐牐牐爙牐牐牐爙牐爙
牐犐厦嬲飧隼子清晰地演示了客户端程序的编写要点,下面我们讨论一下如何建立服务器程序。这个例子将使用TcpListener类,在13号端口监听,一旦有客户端连接,将立即向客户端发送当前服务器的时间信息。
牐燭cpListener的关键在于AcceptTcpClient()方法,该方法将检测端口是否有未处理的连接请求,如果有未处理的连接请求,该方法将使服务器同客户端建立连接,并且返回一个TcpClient对象,通过这个对象的GetStream方法建立同客户端通讯的数据流。事实上,TcpListener类还提供一个更为灵活的方法AcceptSocket(),当然灵活的代价是复杂,对于比较简单的程序,AcceptTcpClient()已经足够用了。此外,TcpListener类提供Start()方法开始监听,提供Stop()方法停止监听。
牐犑紫任颐鞘褂枚丝诔跏蓟一个TcpListener实例,并且开始在13端口监听:
牐爌rivate const int portNum = 13;
牐燭cpListener listener = new TcpListener(portNum);
牐爈istener.Start();//开始监听
牐犎绻有未处理的连接请求,使用AcceptTcpClient方法进行处理,并且获取数据流:
牐燭cpClient client = listener.AcceptTcpClient();
牐燦etworkStream ns = client.GetStream();
牐犎缓螅获取本机时间,并保存在字节数组中,使用NetworkStream.Write()方法写入数据流,然后客户端就可以通过Read()方法从数据流中获取这段信息:
牐燽yte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());
牐爊s.Write(byteTime, 0, byteTime.Length);
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)牐爊s.Close();//不要忘记关闭数据流和连接
牐燾lient.Close();
牐牱务器端程序完整的程序清单如下:
牐
using System;牐爑sing System.Net.Sockets;牐爑sing System.Text;牐爊amespace TimeServer牐爗牐牐牐燾lass TimeServer牐牐牐爗牐牐牐牐牐爌rivate const int portNum = 13;牐牐牐牐牐燵STAThread]牐牐牐牐牐爏tatic void Main(string[] args)牐牐牐牐牐爗牐牐牐牐牐牐牐燽ool done = false;牐牐牐牐牐牐牐燭cpListener listener = new TcpListener(portNum);牐牐牐牐牐牐牐爈istener.Start();牐牐牐牐牐牐牐爓hile (!done)牐牐牐牐牐牐牐爗牐牐牐牐牐牐牐牐牐燙onsole.Write("Waiting for connection...");牐牐牐牐牐牐牐牐牐燭cpClient client = listener.AcceptTcpClient();牐牐牐牐牐牐牐牐牐燙onsole.WriteLine("Connection accepted.");牐牐牐牐牐牐牐牐牐燦etworkStream ns = client.GetStream();牐牐牐牐牐牐牐牐牐燽yte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());牐牐牐牐牐牐牐牐牐爐ry牐牐牐牐牐牐牐牐牐爗牐牐牐牐牐牐牐牐牐牐牐爊s.Write(byteTime, 0, byteTime.Length);牐牐牐牐牐牐牐牐牐牐牐爊s.Close();牐牐牐牐牐牐牐牐牐牐牐燾lient.Close();牐牐牐牐牐牐牐牐牐爙牐牐牐牐牐牐牐牐牐燾atch (Exception e)牐牐牐牐牐牐牐牐牐爗牐牐牐牐牐牐牐牐牐牐牐燙onsole.WriteLine(e.ToString());牐牐牐牐牐牐牐牐牐爙牐牐牐牐牐牐牐爙牐牐牐牐牐牐牐爈istener.Stop();牐牐牐牐牐爙牐牐牐爙牐爙
牐牥焉厦媪蕉纬绦蚍直鸨嘁朐诵校琌K,我们已经用C#实现了基于TCP协议的网络通讯,怎么样?很简单吧!
牐犑褂蒙厦娼樯艿幕本方法,我们可以很容易的编写出一些很有用的程序,如FTP,电子邮件收发,点对点即时通讯等等,你甚至可以自己编制一个QQ来!