1.IPEndPoint
C#里IP+端口对应的是IPEndPoint:
先看下如何得到IPEndPoint,其中一个构造函数如下:
- public IPEndPoint(
- IPAddress address,
- int port
- )
这里第一个参数要求是个IPAddress类型的,先看看如果获取IPAddress类型的对象,
其中IPAddress类有个静态方法:
- public static IPAddress Parse(
- 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
构造函数
- public Socket(
- AddressFamily addressFamily,
- SocketType socketType,
- ProtocolType protocolType
- )
使用如 Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
参数1地址家族:这里是IP4
参数2套接字类型:流式套接字,面向连接的。
参数3协议类型:这里TCP协议。
构造了socket对象之后,可以绑定一个IPEndPoint.
- public void Bind(
- EndPoint localEP
- )
- public void Listen(
- int backlog
- )
sck.Listen(10);
所以一个服务端socket程序经过如下几个步骤:
构建一个socket对象===》绑定一个IPEndPoint===>监听客户端的连接===》accept接受客户连接==》发送数据==》关闭客户端socket连接.!!!!!!!----------服务端socket关闭
完整服务端:
- IPAddress ia = IPAddress.Parse("192.168.1.152");
- IPEndPoint ie = new IPEndPoint(ia, 12345);
- Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- sck.Bind(ie);
- sck.Listen(10);
- Socket client = sck.Accept();
- client.Close();
- sck.Close();
下面看看客户端,服务端在监听来自客户端的连接,现在服务端就绪,我们客户端去连接服务端:
socket有一个connect方法:
- public void Connect(
- EndPoint remoteEP
- )
现在就是要与192.168.1.152:12345建立连接。
参数需要一个EndPoint对象,
- IPAddress ia = IPAddress.Parse("192.168.1.152");
- IPEndPoint ie = new IPEndPoint(ia, 12345);
- Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- sck.Connect(ie);
与服务器建立连接,成功了就可以交换数据了,还有个构造版本:
- public void Connect(
- IPAddress address,
- int port
- )
所以也可以这样:
- Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- sck.Connect(IPAddress.Parse("192.168.1.152"), 12345);
连接上就可以发送接受数据了,这里客户端像服务端发个字符串:
- Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- sck.Connect(IPAddress.Parse("192.168.1.152"), 12345);
- sck.Send(Encoding.ASCII.GetBytes("hello,this is Client!"));
- sck.Close();
调用socket的Send方法,发送完后关闭socket。
看看服务端:
- IPAddress ia = IPAddress.Parse("192.168.1.152");
- IPEndPoint ie = new IPEndPoint(ia, 12345);
- Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- sck.Bind(ie);
- sck.Listen(10);
- Socket client = sck.Accept();//如果客户端没有连接来,则会阻塞到这里
- byte[] data = new byte[1024];
- int len = client.Receive(data);
- MessageBox.Show(Encoding.ASCII.GetString(data, 0, len));
- client.Close();
- sck.Close();
我们发现我们的程序有个问题:
客户端连接,程序继续,接受客户端,然后接收数据,然后关闭客户端连接,接着服务端也关闭了。