private void ProcessReceive(SocketAsyncEventArgs receiver) { if (receiver.LastOperation != SocketAsyncOperation.Receive) { return; } if (receiver.BytesTransferred > 0) { if (receiver.SocketError == SocketError.Success) { int _byteTransferred = receiver.BytesTransferred; string _received = Encoding.Unicode.GetString(receiver.Buffer, receiver.Offset, _byteTransferred); SocketRequestMessage _msg = SocketRequestHandler.GetActualString(_received); if (this.OnMsgReceived != null) { OnMsgReceived((receiver as SocketAsyncEventArgsImpl).UID, _msg); } bool _willRaiseEvent = (receiver.UserToken as Socket).ReceiveAsync(receiver); if (!_willRaiseEvent) { ProcessReceive(receiver); } } } else { this.CloseClientSocket((receiver as SocketAsyncEventArgsImpl).UID, true); } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnReceive(object sender, SocketAsyncEventArgs e) { string msg = Encoding.Unicode.GetString(e.Buffer, 0, e.BytesTransferred); SocketRequestMessage _msgs = SocketRequestHandler.GetActualString(msg); ListenAsync(); if (OnMsgReceived != null) { OnMsgReceived(_msgs); } }
/// <summary> /// 开始监听线程的入口函数 /// </summary> public string Listen(Socket socket = null) { if (socket == null) { socket = (_readWirted.ReceiveSAEA.UserToken as Socket); } byte[] _bytes = new byte[1024]; StringBuilder _sb = new StringBuilder(); int flag = socket.Receive(_bytes, 0, _bytes.Length, SocketFlags.None); string _msg = Encoding.Unicode.GetString(_bytes); _sb.Append(_msg); SocketRequestMessage _rquestMsg = SocketRequestHandler.GetActualString(_msg); //如果没有接收到定长的数据,循环接收 while (flag != _rquestMsg.MessageLength) { flag += socket.Receive(_bytes, flag, _bytes.Length - flag, SocketFlags.None); _sb.Append(Encoding.Unicode.GetString(_bytes)); } return(_sb.ToString()); }
public static SocketRequestMessage GetActualString(string input, List <string> outputList = null) { if (outputList == null) { outputList = new List <string>(); } if (!string.IsNullOrEmpty(temp)) { input = temp + input; } string output = ""; string lenStr = @"(?<=^\[length=)(\d+)(?=\])"; string pattern = @"(\[MSG=)(JSON|XML|NONE|REQUEST)(?=\])"; int length = 0; SocketMessageInfoType _type = CheckMessageInfoType(input); if (Regex.IsMatch(input, lenStr)) { Match lenRex = Regex.Match(input, lenStr); length = Convert.ToInt32(lenRex.Groups[0].Value); if (Regex.IsMatch(input, pattern)) { Match m = Regex.Match(input, pattern); int startIndex = input.IndexOf(m.Groups[0].Value + "]") + m.Groups[0].Value.Length + 1; output = input.Substring(startIndex); if (output.Length == length) { outputList.Add(output); temp = ""; } else if (output.Length < length) { temp = input; } else if (output.Length > length) { output = output.Substring(0, length); outputList.Add(output); temp = ""; input = input.Substring(startIndex + length); GetActualString(input, outputList); } } } else { temp = input; } SocketRequestMessage message = new SocketRequestMessage() { MessageLength = length, MessageType = _type, Messages = outputList.ToArray() }; return(message); }