异步服务端相对于同步服务端,不会造成线程的阻塞。
在高并发多连接的情况下,比同步多线程具有更大的优势。当然也有缺点,Begin异步无法复用IAsyncResult,每次收发数据都会产生大量的临时对象,对服务端gc回收产生一定的影响。
BeginXXX(AsyncCallback, object)
1.AsyncCallback 参数为IAsyncResult的回调函数, IAsyncResult接口对象有我们需要的Socket句柄等等...
2.此请求的对象。
话不多说,上示例。
服务端:
public class Server
{
private Socket _serverSocket;
private int _prot;
private int _maxClient;
public Server(int prot, int maxClient)
{
_prot = prot;
_maxClient = maxClient;
}
public void Start()
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, _prot));
_serverSocket.Listen(_maxClient);
StartAccept();
}
private void StartAccept()
{
_serverSocket.BeginAccept(new AsyncCallback(AcceptRequest), _serverSocket);
}
private void AcceptRequest(IAsyncResult ar)
{
Socket server = ar.AsyncState as Socket;
Socket clientSocket = server.EndAccept(ar);
Console.WriteLine(string.Format("客户端 {0} 连接", clientSocket.RemoteEndPoint));
Client client = new Client(clientSocket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptRequest), _serverSocket);
}
}
服务端存储的客户端类:
public class Client
{
public Socket ClientSocket;
public byte[] _buff;
public Client(Socket socket)
{
ClientSocket = socket;
_buff = new byte[1024];
StartRecv();
}
private void StartRecv()
{
ClientSocket.BeginReceive(_buff, 0, _buff.Length, 0, RecvRequest, ClientSocket);
}
private void RecvRequest(IAsyncResult ar)
{
Socket client = ar.AsyncState as Socket;
int l = client.EndReceive(ar);
if (l > 0)
{
Console.WriteLine(Encoding.Default.GetString(_buff));
}
}
}
本机测试可运行,客户端没有考虑并发,用同步就行了。
如上有问题,欢迎指正。