C#网络编程TcpClient、TcpListener、UdpClient

        说到网络编程,就少不了要说说Socket。无论是在Linux系统中还是Windows系统中,都支持Socket编程。所谓的Socket就是一个套接字,由一个IP地址和一个端口确定。网络编程中一般支持面向连接和面向无连接两种,面向连接使用TCP协议,无连接使用UDP协议。下面两幅图描述面向连接和面向无连接的Socket通信过程。


图一:面向连接


图二:面向无连接

     从图一中可以看出,要使用Socket实现通信需要的基本步骤。首先要实例化一个Socket对象,然后进行绑定。由于面向连接,服务器端需要一直监听是否有客户端尝试连接进来。客户端同样需要实例化Socket对象,尝试连接服务器,当服务器接受某客户端的连接请求时,连接建立,此时客户端和服务器断可以进行Send和Recieve数据。.netframework允许以这样的方式来使用Socket,同时提供TcpClient、TcpListener、UdpClient三个类来简化编程过程。下面给出这三个类的使用方法。

  //TCPClient的第一种使用方法
            //声明一个TCPClient对象,并自动绑定到本地地址和一个端口上
            TcpClient test1 = new TcpClient();
            //TCPClient对象试图连接到远程主机上的8080端口上
            test1.Connect("www.baidu.com", 8080);


            //TCPClient的第二种使用方法
            //直接创建TCPClient对象,连接到远程主机上(本地自动分配随机端口)
            TcpClient test2 = new TcpClient("www.baidu.com",8080);


            //TCPClient的第三种使用方法
            //自己指定本地地址和端口值(可以尝试制定非本地地址,以伪装自己发送数据包)
            IPAddress ipa = Dns.GetHostByName(Dns.GetHostName()).AddressList[0];
            IPEndPoint ipe = new IPEndPoint(ipa,9090);
            //创建TCPClient对象,将其绑定到指定的本地地址和端口上
            TcpClient test3 = new TcpClient(ipe);
            //尝试连接到远程主机上
            test3.Connect("www.baidu.com", 8080);

            //TCPClient对象创建完,可以使用GetStream方法创建Stream类,进行收发数据
            NetworkStream ns = test3.GetStream();
            //写入数据
            byte[] outStream = Encoding.ASCII.GetBytes("Testing");
            ns.Write(outStream,0,outStream.Length);
            //读取数据
            byte[] inStream = new byte[1024];
            ns.Read(inStream,0,inStream.Length);


  TcpListener  listener= new TcpListener(9050);
            //启动侦听
            listener.Start();
            //AcceptClient方法返回值是TcpClient类型
            TcpClient client = listener.AcceptTcpClient();
            //得到TCPClient对象后,可以像上一个例子中一样,使用GetStream方法,读写数据
            NetworkStream ns = client.GetStream();
            //写入数据
            byte[] outStream = Encoding.ASCII.GetBytes("Testing");
            ns.Write(outStream,0,outStream.Length);
            //读取数据
            byte[] inStream = new byte[1024];
            ns.Read(inStream, 0, inStream.Length);
            //各种关闭
            ns.Close();
            client.Close();
            listener.Stop();



            //创建UDPClient对象
            UdpClient client = new UdpClient(8000);
            //接受发送主机的IP地址信息
            IPEndPoint remoteclient = new IPEndPoint(IPAddress.Any,0);
            //Receive方法包含一个IPEndPoint,携带远程发送主机的IP地址信息
            byte[] recv = client.Receive(ref remoteclient);
            string data = Encoding.ASCII.GetString(recv);
            Console.WriteLine("Data comes from : {0}",remoteclient.ToString());
            Console.WriteLine("Data : {0}", data);
            client.Close();


            //UDPClient对象创建,发送数据
            UdpClient client1 = new UdpClient(8001);
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.1.11"),8001);
            byte[] sendMsg = Encoding.ASCII.GetBytes("Sending Messages");
            client1.Send(sendMsg, sendMsg.Length, ipe);
            client1.Close();

这样使用,可以方便编程,但对理解Socket实现过程没有好处。


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/gxwang/p/4940882.html