说到网络编程,就少不了要说说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实现过程没有好处。
版权声明:本文为博主原创文章,未经博主允许不得转载。