/// <summary> /// 开始接受数据 /// </summary> /// <param name="e"></param> private void startReceive(ClientPeer clientPeer) { try { //clientPeer.ReceiveArgs.Completed += receive_Complateed;//为异步事件注册方法 //开始异步接受数据 bool result = clientPeer.Clientsocket.ReceiveAsync(clientPeer.ReceiveArgs); if (result == false) { processReceive(clientPeer.ReceiveArgs); } } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
/// <summary> /// 连接成功后进行处理 /// </summary> /// <param name="e">SocketAsyncEventArgs</param> private void processAccept(SocketAsyncEventArgs e) { semaphore.WaitOne(); //若达到最大连接数量则阻止该线程 //Socket clientsocket = e.AcceptSocket; ClientPeer clientPeer = clientPeerPool.DequeuePool(); //取出对象池中的对象 clientPeer.Clientsocket = e.AcceptSocket; if (clientPeer.Clientsocket != null) { Console.WriteLine("客户端连接成功 :" + clientPeer.Clientsocket.RemoteEndPoint.ToString()); } if (clientPeer != null) { startReceive(clientPeer); } //e = null; e.AcceptSocket = null; startAccept(e);//递归调用,处理其他连接 }
public void Start(int Port, int MaxCount)//端口号 最大人数 { try { semaphore = new Semaphore(MaxCount, MaxCount); //挂起等待连接的最大数量 clientPeerPool = new ClientPeerPool(MaxCount); ClientPeer tempClient = null; for (int i = 0; i < MaxCount; i++) { tempClient = new ClientPeer(); tempClient.ReceiveComplatedEvent += PacketReceiveComplatedEvent; //数据包解析完成后的回调 tempClient.ReceiveArgs.Completed += receive_Complateed; //数据接收异步操作接受完成后的操作 tempClient.SendFailEvent += DisConttect; //注册向客户端发送数据失败的事件 clientPeerPool.EnqueuePool(tempClient); } serversocket.Bind(new IPEndPoint(IPAddress.Any, Port)); serversocket.Listen(10); Console.WriteLine("服务器启动成功"); startAccept(null); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
/// <summary> /// 一个数据包解析完成后的回调方法 /// </summary> /// <param name="clientPeer">连接对象</param> /// <param name="value">消息</param> private void PacketReceiveComplatedEvent(ClientPeer clientPeer, SocketMsg value) { //给应用层数据,让其使用 application.OnReceive(clientPeer, value); }
/// <summary> /// 将新连接的客户端加入对象池末尾 /// </summary> /// <param name="clientPeer"></param> public void EnqueuePool(ClientPeer clientPeer) { clientPeers.Enqueue(clientPeer); }