예제 #1
0
        // 数据接受回调函数
        private void HandleDataReceived(IAsyncResult ar)
        {
            if (IsRunning)
            {
                TCPClientState state = (TCPClientState)ar.AsyncState;
                if (state.TcpClient == null || !state.TcpClient.Connected)
                {
                    return;
                }
                NetworkStream stream = state.NetworkStream;

                int receivedBytes = 0;
                try
                {
                    receivedBytes = stream.EndRead(ar);
                }
                catch
                {
                    receivedBytes = 0;
                }

                if (receivedBytes == 0)
                {
                    // connection has been closed
                    lock (this._clients)
                    {
                        this._clients.Remove(state);
                        //触发客户端连接断开事件
                        RaiseClientDisconnected(state);

                        //Log.OutputLine("连接断开");
                        state.Close();

                        return;
                    }
                }

                // received byte and trigger event notification
                byte[] buff = new byte[receivedBytes];
                Buffer.BlockCopy(state.Buffer, 0, buff, 0, receivedBytes);
                //触发数据收到事件
                RaiseDataReceived(state, buff);

                try
                {
                    if (state.TcpClient.Connected)
                    {
                        // continue listening for tcp datagram packets
                        stream.BeginRead(state.Buffer, 0, state.Buffer.Length, HandleDataReceived, state);
                    }
                }
                catch
                {
                }
            }
        }
예제 #2
0
        /// <summary>
        /// 关闭一个与客户端之间的会话
        /// </summary>
        /// <param name="state">需要关闭的客户端会话对象</param>
        public void Close(TCPClientState state)
        {
            if (state != null)
            {
                state.Close();

                lock (this._clients)
                {
                    this._clients.Remove(state);
                }
                //TODO 触发关闭事件
            }
        }