1.IPEndPoint 

C#里IP+端口对应的是IPEndPoint:


先看下如何得到IPEndPoint,其中一个构造函数如下:

 
  
  1. public IPEndPoint( 
  2.     IPAddress address, 
  3.     int port 

这里第一个参数要求是个IPAddress类型的,先看看如果获取IPAddress类型的对象,

其中IPAddress类有个静态方法:

 
  
  1. public static IPAddress Parse( 
  2.     string ipString 

比如IPAddress ia=IPAddress.Parse("127.0.0.1");

 

这样就可以如下:

 

 IPAddress ia = IPAddress.Parse("127.0.0.1");

 IPEndPoint ie = new IPEndPoint(ia, 1234);

 

得到一个IPEndPoint对象。

2.Socket

构造函数

 
  
  1. public Socket( 
  2.     AddressFamily addressFamily, 
  3.     SocketType socketType, 
  4.     ProtocolType protocolType 

 

使用如  Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

参数1地址家族:这里是IP4

参数2套接字类型:流式套接字,面向连接的。

参数3协议类型:这里TCP协议。

构造了socket对象之后,可以绑定一个IPEndPoint.

 

 
  
  1. public void Bind( 
  2.     EndPoint localEP 
绑定后就可以监听了: sck.Bind(ie);
 
  
  1. public void Listen( 
  2.     int backlog 


sck.Listen(10);

 

所以一个服务端socket程序经过如下几个步骤:

构建一个socket对象===》绑定一个IPEndPoint===>监听客户端的连接===》accept接受客户连接==》发送数据==》关闭客户端socket连接.!!!!!!!----------服务端socket关闭

 

完整服务端:

 

 
  
  1. IPAddress ia = IPAddress.Parse("192.168.1.152"); 
  2. IPEndPoint ie = new IPEndPoint(ia, 12345); 
  3.  
  4. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  5.  
  6. sck.Bind(ie); 
  7. sck.Listen(10); 
  8. Socket client = sck.Accept(); 
  9. client.Close(); 
  10.  
  11. sck.Close(); 

 下面看看客户端,服务端在监听来自客户端的连接,现在服务端就绪,我们客户端去连接服务端:

socket有一个connect方法:

 

 
  
  1. public void Connect( 
  2.     EndPoint remoteEP 

现在就是要与192.168.1.152:12345建立连接。

参数需要一个EndPoint对象,

 

 
  
  1. IPAddress ia = IPAddress.Parse("192.168.1.152"); 
  2. IPEndPoint ie = new IPEndPoint(ia, 12345); 
  3. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  4. sck.Connect(ie); 

与服务器建立连接,成功了就可以交换数据了,还有个构造版本:

 

 
  
  1. public void Connect( 
  2.     IPAddress address, 
  3.     int port 

所以也可以这样:

 

 
  
  1. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  2. sck.Connect(IPAddress.Parse("192.168.1.152"), 12345); 

连接上就可以发送接受数据了,这里客户端像服务端发个字符串:

 

 
  
  1. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  2. sck.Connect(IPAddress.Parse("192.168.1.152"), 12345); 
  3. sck.Send(Encoding.ASCII.GetBytes("hello,this is Client!")); 
  4. sck.Close(); 

调用socket的Send方法,发送完后关闭socket。

看看服务端:

 

 
  
  1. IPAddress ia = IPAddress.Parse("192.168.1.152"); 
  2. IPEndPoint ie = new IPEndPoint(ia, 12345); 
  3.  
  4. Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  5.  
  6. sck.Bind(ie); 
  7. sck.Listen(10); 
  8.  
  9. Socket client = sck.Accept();//如果客户端没有连接来,则会阻塞到这里 
  10. byte[] data = new byte[1024]; 
  11. int len = client.Receive(data); 
  12. MessageBox.Show(Encoding.ASCII.GetString(data, 0, len)); 
  13. client.Close(); 
  14.  
  15. sck.Close(); 

我们发现我们的程序有个问题:

客户端连接,程序继续,接受客户端,然后接收数据,然后关闭客户端连接,接着服务端也关闭了。


 本文转自 xcf007 51CTO博客,原文链接:http://blog.51cto.com/xcf007/472649 ,如需转载请自行联系原作者