Socket服务端启动Listen后,调用BeginAccept方法等待客户端连接,当客户端连接成功后,调用BeginReceive方法,然后继续调BeginAccept方法,BeginReceive在执行回调事件的最后继续等待接收,这样的话,是不是就是说,如果我有1W个客户端长连接服务端,服务端就要有1W个线程来做这个工作呢。Socket socket...
socket.Listen(10);socket.BeginAccept(new AsycCallBack(AcceptCallBack),null);private void AcceptCallBack(IAsyncResult ar)
        {
            Socket handler = socket.EndAccept(ar);
            AsySocket NewSocket = new AsySocket(handler);
            //激发事件
            socket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
            //重新监听
            mSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
        }private void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                //
                StateObject state = ar.AsyncState as StateObject;
                //读取数据
                int bytesRead = mSocket.EndReceive(ar);
                if (bytesRead > 0)
                {
                    state.sb.Append(UTF8Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
                    string sb = state.sb.ToString();
                    if (sb.Length>0)
                    {
                        //接收完成
                        //激发事件
                        if (onStreamData != null)
                            onStreamData(mID, UTF8Encoding.UTF8.GetBytes(sb));
                        if (onStringData != null)
                            onStringData(mID, sb);
                        //
                        state = new StateObject();
                        state.workSocket = mSocket;
                    }
                    // Get the rest of the data.
                    mSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                }
            }
            catch (SocketException se)
            {
                if (onClosed != null)
                    onClosed(ID,se.Message);
            }
            catch (Exception e)
            {
                throw new ApplicationException(e.Message);
            }        }