/// <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; } } } }
/// <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; } } }