技术开发 频道

异步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
相关文章