private void ProcessData(byte[] bytes, int count) { for (int i = 0; i < count; i++) { byte b = bytes[i]; if (b == _delimByte) { // Message done! byte[] message = _currentMessage.ToArray(); _currentMessage.Clear(); _escaped = false; OnNewMessage?.Invoke(message); } else if (b == _escapeByte) { _escaped = true; } else if (_escaped) { _escaped = false; switch (b) { case _escapeEscapeByte: _currentMessage.Add(_escapeByte); break; case _escapeDelimByte: _currentMessage.Add(_delimByte); break; case _closeConnection: OnCloseConnection?.Invoke(); SocketClose(); return; default: // Unrecognized escape sequence! break; } } else { _currentMessage.Add(b); } } }
/// <summary> /// 接收数据 /// </summary> private void Receive() { int Size = 0; MemoryStream ms = new MemoryStream(); byte[] _byte = new byte[ReceiveBufferSize]; try { while (true) { int i = this.Receive(_byte, SocketFlags.None); byte[] _newbyte = new byte[i]; Buffer.BlockCopy(_byte, 0, _newbyte, 0, i); byte[] _Data = new byte[i]; if (Size == 0)//得到大小之后就不用再去得到 { byte[] _PacketDataSize = new byte[100]; _Data = new byte[_newbyte.Length - 100]; Buffer.BlockCopy(_newbyte, 0, _PacketDataSize, 0, 100); Size = int.Parse(System.Text.ASCIIEncoding.ASCII.GetString(_PacketDataSize).ToString()); //数据大小 Buffer.BlockCopy(_newbyte, 100, _Data, 0, _Data.Length); //数据 } else { Buffer.BlockCopy(_newbyte, 0, _Data, 0, _Data.Length); //已经接收到大小,这里就不用再接收。 } ms.Write(_Data, 0, _Data.Length); if (Size == ms.Length)//判断是否传送完毕 { this.OnReceivedBigData.BeginInvoke(Deserialize(ms.ToArray()), i, this, null, null); ms.Close(); ms.Dispose(); ms = new MemoryStream(); Size = 0; } } } catch (Exception e) { Error_Message = e.Message; OnError.BeginInvoke(e.Message, null, null); OnCloseConnection.BeginInvoke(null, null); CloseSocket(); } }
/// <summary> /// 发送数据 /// </summary> /// <param name="_str">要发送的数据</param> public void SendTo(Object data) { try { byte[] _Data = new byte[SendBufferSize]; _Data = this.Serialize(data); int _DataSize = _Data.Length; byte[] _PacketDataSize = System.Text.ASCIIEncoding.ASCII.GetBytes(_DataSize.ToString()); byte[] _Packet = new byte[100 + _Data.Length]; Buffer.BlockCopy(_PacketDataSize, 0, _Packet, 0, _PacketDataSize.Length); Buffer.BlockCopy(_Data, 0, _Packet, 100, _Data.Length); this.OnSendData.BeginInvoke(this.Send(_Packet), this.RemoteEndPoint.ToString(), null, null); } catch (Exception e) { Error_Message = e.Message; OnError.BeginInvoke(e.Message, null, null); OnCloseConnection.BeginInvoke(null, null); CloseSocket(); } }