110,536
社区成员
发帖
与我相关
我的任务
分享
//服务器端 初始化
sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Bind(new IPEndPoint(ip, port));
sock.Listen(2);
//线程里
Socket client = sock.Accept(); // 为客户端建立服务连接 并等待连接
while(true)
{
client.Receive(buffer, buffer.Length, SocketFlags.None);
//当客户关闭时上面这句会抛出异常,我应该怎么处理才可以重新调用client.Receive来接受呢?
//调用client.Close()之后 重新new一个 client再绑定还是会提示IP套接字只能用一次
}
IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Bind(localEndPoint);
socket.Listen(20);
while (true)
{
Socket connection = socket.Accept();
// 收发代码略 ……
}
很明显,同步方式执行socket.Accept()的时候,程序被阻塞,直到有新的连接请求的时候程序才会执行下一句。
要避免阻塞,推荐使用异步方式
IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Bind(localEndPoint);
socket.Listen(20);
//启动异步Accept
socket.BeginAccept(AcceptCallBack, socket);
//异步接收回调
void AcceptCallBack(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket //结束异步Accept并获已连接的Socket
Socket connection = socket.EndAccept(ar); // 通过connection收发操作的代码略……
//继续异步Accept,保证可以Accept后续的接入
socket.BeginAccept(AcceptCallBack, socket);
}