Esempio n. 1
0
        /// <summary>
        /// 建立SESSION连接的数据接受处理函数,异步的特性就体现在这个函数中,
        /// 收到数据后,会自动解析为字符串报文
        /// </summary>
        /// <param name="iar">目标客户端Socket</param>
        protected virtual void ReceiveConnData(IAsyncResult iar)
        {
            lock (_tableLockObj)
            {
                Socket client = (Socket)iar.AsyncState;
                try
                {
                    //如果两次开始了异步的接收,所以当客户端退出的时候
                    //会两次执行EndReceive
                    int recv = client.EndReceive(iar);

                    if (recv == 0)
                    {
                        //正常的关闭
                        client.Close();
                        return;
                    }

                    string receivedData = _coder.GetEncodingString(_recvDataBuffer, recv);
                    //发布收到数据的事件
                    if (RecvData != null)
                    {
                        //如果定义了报文的尾标记,需要处理报文的多种情况
                        if (_resolver != null)
                        {
                            string[] recvDatagrams = _resolver.Resolve(ref receivedData);
                            if (recvDatagrams.Length > 0)
                            {
                                if (!_sessionTable.ContainsKey(recvDatagrams[0]))
                                {
                                    Session newSession = new Session(client, recvDatagrams[0]);

                                    _sessionTable.Add(newSession.ID, newSession);

                                    //客户端引用计数+1
                                    _clientCount++;

                                    //回发确认信息
                                    this.Send(newSession, recvDatagrams[0] + _resolver.EndTag);

                                    //新的客户段连接,发出通知
                                    if (ClientConn != null)
                                    {
                                        ClientConn(this, new NetEventArgs(newSession));
                                    }
                                    //继续接收来自来客户端的数据
                                    client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None,
                                                        new AsyncCallback(ReceiveData), newSession);
                                    return;
                                }
                            }
                        }
                        //没有定义报文的尾标记,直接交给消息订阅者使用
                        else
                        {
                            if (!String.IsNullOrEmpty(receivedData))
                            {
                                if (!_sessionTable.ContainsKey(receivedData))
                                {
                                    Session newSession = new Session(client, receivedData);

                                    _sessionTable.Add(newSession.ID, newSession);

                                    //客户端引用计数+1
                                    _clientCount++;

                                    //回发确认信息
                                    this.Send(newSession, receivedData + _resolver.EndTag);

                                    //新的客户段连接,发出通知
                                    if (ClientConn != null)
                                    {
                                        ClientConn(this, new NetEventArgs(newSession));
                                    }

                                    //继续接收来自来客户端的数据
                                    client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None,
                                                        new AsyncCallback(ReceiveData), newSession);
                                    return;
                                }
                            }
                        }
                        client.Shutdown(SocketShutdown.Both);
                        client.Close();
                    }//end of if(RecvData!=null)
                }
                catch (SocketException ex)
                {
                    //客户端退出
                    if (10054 == ex.ErrorCode)
                    {
                        //正常的关闭
                        if (!Object.Equals(null, client))
                        {
                            //关闭数据的接受和发送
                            client.Shutdown(SocketShutdown.Both);
                            client.Close();
                        }
                    }
                }
                catch (ObjectDisposedException ex)
                {
                    if (ex != null)
                    {
                        ex = null;
                        //DoNothing;
                    }
                }
                catch (Exception ex)
                {
                    if (ex != null)
                    {
                        ex = null;
                    }
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 建立SESSION连接的数据接受函数
        /// </summary>
        /// <param name="iar">异步Socket</param>
        protected virtual void RecvConnData(IAsyncResult iar)
        {
            Socket remote = (Socket)iar.AsyncState;

            try
            {
                int recv = remote.EndReceive(iar);

                //正常的退出
                if (recv == 0)
                {
                    return;
                }

                string receivedData = _coder.GetEncodingString(_recvDataBuffer, recv);

                //通过事件发布收到的报文
                if (ReceivedDatagram != null)
                {
                    //通过报文解析器分析出报文
                    //如果定义了报文的尾标记,需要处理报文的多种情况
                    if (_resolver != null)
                    {
                        string[] recvDatagrams = _resolver.Resolve(ref receivedData);

                        if (recvDatagrams.Length > 0)
                        {
                            //创建新的会话
                            _session      = new Session(remote, recvDatagrams[0]);
                            _connectState = ConnectState.Connected;

                            //触发连接建立事件
                            if (ConnectedServer != null)
                            {
                                ConnectedServer(this, new NetEventArgs(_session));
                            }
                        }
                    }
                    //没有定义报文的尾标记,直接交给消息订阅者使用
                    else
                    {
                        if (!String.IsNullOrEmpty(receivedData))
                        {
                            //创建新的会话
                            _session      = new Session(remote, receivedData);
                            _connectState = ConnectState.Connected;

                            //触发连接建立事件
                            if (ConnectedServer != null)
                            {
                                ConnectedServer(this, new NetEventArgs(_session));
                            }
                        }
                    }
                }//end of if(ReceivedDatagram != null)

                if (Object.Equals(null, _session))
                {
                    //if (CannotConnectedServer != null)
                    //{
                    //    CannotConnectedServer(this, new NetEventArgs());
                    //}
                    return;
                }
                //接收数据
                _session.ClientSocket.BeginReceive(_recvDataBuffer, 0, DefaultBufferSize, SocketFlags.None,
                                                   new AsyncCallback(RecvData), _session.ClientSocket);
            }
            catch (SocketException ex)
            {
                //客户端退出
                //if (10054 == ex.ErrorCode)
                //{
                if (CannotConnectedServer != null)
                {
                    CannotConnectedServer(this, new NetEventArgs());
                }
                Close();
                return;
                //}
                //else
                //{
                //    throw (ex);
                //}
            }
            catch (ObjectDisposedException ex)
            {
                if (ex != null)
                {
                    ex = null;
                    //DoNothing;
                }
            }
        }