异步Socket
【IT168 技术文档】
前几天,用多线程实现了能够接受多个客户端连接的服务器程序。学习了异步套接字,发现使用异步通讯模式,不用担心通讯阻塞和线程问题。阻塞方式下使用套接字创建网络程序,套接字将保持等待状态,直到完成他们的功能,并且维持在应用程序中的其他功能直至结束 。非阻塞的程序使用异步套接字,允许网络程序继续执行,而不是等待网络操作。
异步Socket的使用方法(TCP服务器端)
Socket serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
//绑定端口
IPEndPoint iep = new IPEndPoint(IPAddress.Any, _port);
serverSocket.Bind(iep);
//开始监听
serverSocket.Listen(10);
//设置异步方法接受客户端连接
serverSocket.BeginAccept(new AsyncCallback(AcceptConn), serverSocket);
……………
serverSocket.Close();
![]()
void AcceptConn(IAsyncResult iar)
...{
byte[]RecvData;
Socket oldserver=(Socket)iar.AsyncState;
Socket client=oldserver.EndAccept(iar);
//开始接受来自该客户端的数据
client.BeginReceive(RecvData,0,RecvData.Length,SocketFlags.None,new AsyncCallback(ReceiveData),client);
//继续接受其他客户端的连接
client.BeginAccept(new AsyncCallback(AcceptConn),client);
}
![]()
void ReceiveData(IAsyncResult iar)
...{
byte[] RecvData;
string strRecv;
Socket client=(Socket)iar.AsyncState;
int recv=client.EndReceive(iar);
if(recv==0)
client.Close();
else
...{
strRecv=Encoding.Default.GetString(RecvData,0,recv);
//将接收到的数据再发送给客户端
client.BeginSend(RecvData,0,recv,SocketFlags.None,new AsyncCallback(SendData),client);
}
//继续接收来自来客户端的数据
client.BeginReceive(RecvData,0,RecvData.Length,SocketFlags.None,new AsyncCallback(ReceiveData),client);
}
![]()
void SendData(IAsyncResult iar)
...{
Socket client = (Socket)iar.AsyncState;
int sent = client.EndSend(iar);
}
异步Socket的使用方法(TCP客户端)
Socket newsock = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
![]()
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
Connected(IAsyncResult iar)
void
...{
byte[] RecvData;
Socket socket = (Socket)iar.AsyncState;
socket.EndConnect(iar);
//建立连接后应该立即接收数据
socket.BeginReceive(RecvData, 0,RecvData.Length, SocketFlags.None,
new AsyncCallback(RecvData), socket);
}
接收和发送数据与服务器端的相同
0
相关文章
