/// <summary> /// 开启服务器 /// </summary> /// <param name="port">端口号</param> /// <param name="maxCount">最大连接数量</param> public void Start(ushort port, ushort maxCount) { try { serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sema = new Semaphore(maxCount, maxCount); clientPool = new ClientPeerPool(maxCount); ClientPeer clientPeer = null; for (int i = 0; i < maxCount; i++) { clientPeer = new ClientPeer(); clientPeer.ReceiveArgs.Completed += Receive_Compelet; clientPeer.rc = ReceiveCompeleted; clientPeer.sd = Disconnect; clientPool.EnqueueClient(clientPeer); } serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); serverSocket.Listen(maxCount); Console.WriteLine("服务器启动成功"); // 服务器启动成功之后, 就开始监听客户端的接入(StartAccept()) StartAccept(null); } catch (Exception e) { Console.WriteLine(e.Message); } }
/// <summary> /// 断开连接 /// </summary> /// <param name="client">当前指定的客户端</param> /// <param name="reason">断开原因</param> public void Disconnect(ClientPeer client, string reason) { try { if (client == null) { throw new Exception("当前客户端为空 , 无法断开连接"); } // 通知应用层,客户端断开连接了 app.OnDisconnect(client); client.Disconnect(); clientPool.EnqueueClient(client); // 回收对象,以便下次使用 sema.Release(); // 退出信号量 , 返回前一个计数 } catch (Exception e) { Console.WriteLine(e.Message); } }