/// <summary> /// 处理数据接收回调 /// </summary> /// <param name="ioEventArgs"></param> private void ProcessReceive(SocketAsyncEventArgs ioEventArgs) { DataToken dataToken = (DataToken)ioEventArgs.UserToken; if (ioEventArgs.BytesTransferred == 0) { //对方主动关闭socket //if (logger.IsDebugEnabled) logger.Debug("对方关闭Socket"); Closing(ioEventArgs, OpCode.Empty); return; } if (ioEventArgs.SocketError != SocketError.Success) { //Socket错误 logger.Debug("IP {0} ProcessReceive:{1}", (dataToken != null ? dataToken.Socket.RemoteEndPoint.ToNotNullString() : ""), ioEventArgs.SocketError); Closing(ioEventArgs); return; } ExSocket exSocket = dataToken == null ? null : dataToken.Socket; List <DataMeaage> messages; bool hasHandshaked; bool needPostAnother = requestHandler.TryReceiveMessage(ioEventArgs, out messages, out hasHandshaked); if (hasHandshaked) { OnHandshaked(new ConnectionEventArgs { Socket = exSocket }); } //modify reason:数据包接收事件触发乱序 if (messages != null) { foreach (var message in messages) { try { switch (message.OpCode) { case OpCode.Close: var statusCode = requestHandler.MessageProcessor != null ? requestHandler.MessageProcessor.GetCloseStatus(message.Data) : OpCode.Empty; if (statusCode != OpCode.Empty) { DoClosedStatus(exSocket, statusCode); } Closing(ioEventArgs, OpCode.Empty); needPostAnother = false; break; case OpCode.Ping: DoPing(new ConnectionEventArgs { Socket = exSocket, Meaage = message }); break; case OpCode.Pong: DoPong(new ConnectionEventArgs { Socket = exSocket, Meaage = message }); break; default: OnDataReceived(new ConnectionEventArgs { Socket = exSocket, Meaage = message }); break; } } catch (Exception ex) { TraceLog.WriteError("OnDataReceived error:{0}", ex); } } } if (needPostAnother) { PostReceive(ioEventArgs); //是否需要关闭连接 if (exSocket.IsClosed) { ResetSAEAObject(ioEventArgs); } } }
private void ProcessReceive(SocketAsyncEventArgs ioEventArgs) { DataToken dataToken = (DataToken)ioEventArgs.UserToken; if (ioEventArgs.BytesTransferred == 0) { //对方主动关闭socket //if (logger.IsDebugEnabled) logger.Debug("对方关闭Socket"); Closing(ioEventArgs, OpCode.Empty); return; } if (ioEventArgs.SocketError != SocketError.Success) { //Socket错误 //if (logger.IsDebugEnabled) logger.Debug("Socket接收错误:{0}", ioEventArg.SocketError); Closing(ioEventArgs); return; } List <DataMeaage> messages; bool hasHandshaked; bool needPostAnother = requestHandler.TryReceiveMessage(ioEventArgs, out messages, out hasHandshaked); if (hasHandshaked) { DoOpened(new SocketEventArgs() { Socket = dataToken.Socket }); } // 触发收到消息事件 if (messages != null) { foreach (var message in messages) { try { if (message.OpCode == OpCode.Close) { var statusCode = requestHandler.MessageProcessor != null ? requestHandler.MessageProcessor.GetCloseStatus(message.Data) : OpCode.Empty; if (statusCode != OpCode.Empty) { OnClosedStatus(statusCode); } Closing(ioEventArgs, OpCode.Empty); needPostAnother = false; break; } OnDataReceived(new SocketEventArgs { Source = message, Socket = dataToken.Socket }); } catch (Exception ex) { logger.Error("OnDataReceived", ex); } } } if (needPostAnother) { PostReceive(ioEventArgs); } }