Example #1
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("当前指定的客户端连接对象为空,无法断开连接");
                }

                Console.WriteLine(client.ClientSocket.RemoteEndPoint.ToString() + "客户端断开连接 原因:" + reason);

                //通知应用层 这个客户的断开连接了
                application.OnDisconnect(client);

                client.Disconnect();
                //回收对象方便下次使用
                clientPeerPool.Enqueue(client);
                acceptSemaphore.Release();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
        }
Example #2
0
        /// <summary>
        /// 用来开启服务器
        /// </summary>
        /// <param name="port">端口号</param>
        ///<param name="maxCount">最大连接数量</param>
        public void Start(int port, int maxCount)
        {
            try
            {
                serverSocket    = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                acceptSemaphore = new Semaphore(maxCount, maxCount);

                //直接new出最大数量的连接对象
                clientPeerPool = new ClientPeerPool(maxCount);
                ClientPeer tmpClientPeer = null;
                for (int i = 0; i < maxCount; i++)
                {
                    tmpClientPeer = new ClientPeer();
                    tmpClientPeer.ReceiveArgs.Completed += receive_Completed;
                    tmpClientPeer.receiveCompleted       = receiveCompleted;
                    tmpClientPeer.sendDisconnect         = Disconnect;
                    clientPeerPool.Enqueue(tmpClientPeer);
                }

                serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
                serverSocket.Listen(10);

                Console.WriteLine("服务器启动...");

                startAccept(null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
        }
Example #3
0
        private Semaphore acceptSemaphore;  //位于system.Threanding 下。限制可同时访问某一资源池的线程数。

        /// <summary>
        /// 开启服务器    1,bind  2,listen  3.accept
        /// </summary>
        /// <param name="port"></param>
        /// <param name="maxCount"></param>
        public void Start(int port, int maxCount)
        {
            try
            {
                serverPeer      = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                acceptSemaphore = new Semaphore(maxCount, maxCount);
                //在连接之前就调用客户端线程池 初始化
                clientPeerPool = new ClientPeerPool(maxCount);
                ClientPeer clientPeer = null;
                for (int i = 0; i < maxCount; i++)
                {
                    clientPeer = new ClientPeer();
                    clientPeer.receiveArgs.Completed += Receive_Complete;
                    clientPeer.receiveCompleted       = ReceiveCompleted;
                    clientPeer.sendDisConnected       = DisConnectd;
                    clientPeerPool.Enqueue(clientPeer);
                }

                serverPeer.Bind(new IPEndPoint(IPAddress.Any, port));
                serverPeer.Listen(10);

                Console.WriteLine("服务器启动成功...");
                StartAccept(null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
        }
Example #4
0
        /// <summary>
        /// 断开连接
        /// </summary>
        /// <param name="client">断开的连接对象</param>
        /// <param name="reason">断开的原因</param>
        public void DisConnectd(ClientPeer client, string reason)
        {
            try
            {
                //清空一些数据
                if (client == null)
                {
                    throw new Exception("当前客户端对象为空,无法断开");
                }

                //通知应用层 这个客户断开连接
                app.DisConnected(client);
                Console.WriteLine(client.clientSocket.RemoteEndPoint.ToString() + "已断开连接" + reason);
                client.Disconnected();
                //回收对象
                clientPeerPool.Enqueue(client);

                acceptSemaphore.Release();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
        }
Example #5
0
        /// <summary>
        /// 开启服务器
        /// </summary>
        /// <param name="port">端口</param>
        /// <param name="maxCount">最大连接数量</param>
        public void Start(int port, int maxCount)
        {
            try
            {
                //修复bug ,设置最大的线程数,  参数:现在可用的线程数量, 最大可用的线程数量
                acceptSemaphore = new Semaphore(maxCount, maxCount);
                //创建线程池
                clientPool = new ClientPeerPool(maxCount);
                ClientPeer tempClient = null;
                for (int i = 0; i < maxCount; i++)
                {
                    tempClient = new ClientPeer();
                    tempClient.ReceiveArgs.Completed += processReceiveCompeleted;
                    //用委托来为client 提供函数
                    tempClient.receiveCompeleted += receiveCompleted;
                    //发送的时候发生异常了,就直接断开连接,简单粗暴
                    tempClient.sendDisConnect += DisConnect;

                    clientPool.Enqueue(tempClient);
                    //
                }
                //任何人都可以接通的
                serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
                //把 10 个线程至于监听状态,不用每一次访问都得重新创建
                serverSocket.Listen(10);
                //服务器启动
                startAccept(null);
            }
            catch (Exception e)
            {
                //报错
                Console.WriteLine(e.Message);
                throw;
            }
        }
Example #6
0
        /// <summary>
        ///  断开连接
        /// </summary>
        /// <param name="client"></param>
        /// <param name="reason"></param>
        public void DisConnect(ClientPeer client, string reason)
        {
            try
            {
                //客户端断开的时候处理的数据,
                //1. 清空client 端的缓存
                //2. 清空client 对象
                if (client == null)
                {
                    throw new Exception("当前的客户端为 null, 无法断开连接");
                }
                Console.WriteLine("ahpilyServer ,disconnect  断开原因" + reason);
                //只有下一次连接的时候才会出现打印,这个是Unity 的Bug
                //TODO 通知应用层,断开连接
                iApplication.onDisconnect(client);
                //

                //
                client.disConnect();
                //回收 直接出来
                clientPool.Enqueue(client);
                // 默然退出一个连接数量
                acceptSemaphore.Release();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
        }
Example #7
0
        /// <summary>
        /// 开启服务器
        /// </summary>
        /// <param name="port">端口号</param>
        /// <param name="maxCount">最大连接数量</param>
        public void Start(int port, int maxCount)
        {
            try
            {
                serverSocket    = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                acceptSemaphore = new Semaphore(maxCount, maxCount);
                clientPeerPool  = new ClientPeerPool(maxCount);
                ClientPeer tempClientPeer = null;
                for (int i = 0; i < maxCount; i++)
                {
                    tempClientPeer = new ClientPeer();
                    clientPeerPool.Enqueue(tempClientPeer);
                }

                serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
                serverSocket.Listen(maxCount);
                Console.WriteLine("服务器启动");
                startAccept(null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }