Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
            }
        }