TcpClient类和TcpListener类属于.NET框架下网络通信中的应用层类,为Socket通信提供了更简单,对用户更为友好的接口。应用层类比位于底层的Socket类提供了更高层次的抽象,封装了套接字的创建,不需要处理连接的细节。
TcpClient类以更高的抽象程度提供TCP服务的基础,因此许多应用层次上的通信协议,比如FTP传输协议、HTTP超文本传输协议都直接创建在TcpClient等类之上。TcpClient类直接为客户端设计,提供了通过网络连接发送和接收数据的简单方法;TcpListener类用于服务器端,用来监视TCP端口上客户端的请求。
1.TcpClient类
要建立TCP连接,应该提供IP地址和端口号。TcpClient类有三种构造函数。
(1)public TcpClient():使用本机默认的IP地址和默认的端口0来创建TCP连接。
(2)public TcpClient(IPEndPoint):IPEndPoint指定在建立远程连接时所使用的本机IP地址和端口号。
(3)public TcpClient(string,int):初始化TcpClient类的新实例,并连接到指定主机上的制定端口。
需要说明的是,在使用前两种构造函数的时候,只是实现了TcpClient实例对象与IP地址和Port端口的绑定,要完成连接,还需要显示地用Connect方法指定与远程主机的连接。
在网络数据接收和发送方面,TcpClient类使用NetworkStream网络流处理技术,使得读写数据更加方便直观,而不需考虑具体传输的内容。在使用GetStream方法获得用于发送和接收数据的网络流之后,就可以使用标准流读写方法Write和Read来发送和接收数据了。
2.TcpListener类
TcpListener类用于监视TCP端口上客户端的请求,通过绑定本机IP地址和端口(IP地址和端口应与客户端请求一致)来创建TcpListener对象实例,由Start()方法启动侦听;当TcpListener侦听到客户端连接后,根据客户端的请求方式来处理请求,即如果是Socket连接请求,则使用AcceptSocket方法,如果是TcpClient连接请求,则使用AcceptTcpClient方法。最后要关闭使用的连接
tcpclient和socket的区别?
Socket完全可以涵盖TcpClient,只不过TcpClient为了简化一部分Socket的功能。
Socket支持TCP,UDP,IP包,Stream,Dgram等诸多类型
而TcpClient只支持TCP和Stream
class Program { static void Main(string[] args) { IPAddress localAddr = IPAddress.Parse("127.0.0.1");//IP地址类,建立一个IP地址对象 TcpListener server = new TcpListener(localAddr, 13000);//使用IP和端口建立侦听器 server.Start();//开始侦听 Console.WriteLine("等待一个连接"); TcpClient client = server.AcceptTcpClient();//接受一个连接,并创建一个服务器端TcpClient Console.WriteLine("客户端已经连接"); //创建网络流相关的读写器 NetworkStream stream = client.GetStream(); StreamReader sr = new StreamReader(stream); StreamWriter sw = new StreamWriter(stream); while (true) { Console.WriteLine("客户端:"+sr.ReadLine());//从客户端接受数据 string msg = Console.ReadLine(); sw.WriteLine(msg);//向客户端发送数据 sw.Flush(); } client.Close(); } }
class Program { static void Main(string[] args) { IPAddress serverAddr = IPAddress.Parse("127.0.0.1"); //创建一个TcpClient TcpClient client = new TcpClient(); //向服务器发送连接请求,需要与服务端的IP和端口一致(节点通信) client.Connect(serverAddr, 13000); //创建流读写器 NetworkStream stream = client.GetStream(); StreamReader sr = new StreamReader(stream); StreamWriter sw = new StreamWriter(stream); while (true) { string msg = Console.ReadLine(); //向服务器端发送数据 sw.WriteLine(msg); sw.Flush(); //从服务器端读取数据 Console.WriteLine("服务器:"+sr.ReadLine()); } client.Close(); } }