Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        /// <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();
            }
        }
Exemple #3
0
 /// <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();
     }
 }