Beispiel #1
0
        public void Listen(int poolSize)
        {
            try
            {
                if (!Listened)
                {
                    workSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    workSocket.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
                    workSocket.Listen(poolSize);
                    Listened     = true;
                    this.BackLog = poolSize;

                    if (acceptThread != null && acceptThread.IsAlive)
                    {
                        acceptThread.Abort();
                    }

                    acceptThread = new Thread(() =>
                    {
                        while (Listened)
                        {
                            accpetDone.Reset();

                            workSocket.BeginAccept((ar) =>
                            {
                                try
                                {
                                    if (Listened)
                                    {
                                        var client                = workSocket.EndAccept(ar);
                                        var tcpClient             = new TcpSocketClient(client);
                                        tcpClient.OnRead         += onRead;
                                        tcpClient.OnSend         += onSend;
                                        tcpClient.OnDisconnected += onDisconnected;
                                        tcpClient.OnException    += onException;
                                        tcpClient.Start();

                                        //调用委托事件
                                        RequestConnectedEvent(tcpClient);
                                    }
                                }
                                catch (Exception e)
                                {
                                    RequestExceptionEvent(e);
                                }
                                finally
                                {
                                    accpetDone.Set();
                                }
                            }, null);

                            accpetDone.WaitOne();
                        }
                    });
                    acceptThread.IsBackground = true;
                    acceptThread.Start();
                    //调用委托事件
                    RequestStartEvent();
                }
            }
            catch (Exception e)
            {
                Listened = false;
                RequestExceptionEvent(e);
            }
        }