Ejemplo n.º 1
0
        /// <summary>
        /// 接收消息
        /// </summary>
        private void ReceiveMessage()
        {
            while (true)
            {
                //接收消息头(消息校验码4字节 + 消息体长度4字节 + 身份ID8字节 + 主命令4字节 + 子命令4字节 + 加密方式4字节 + 返回码4字节 = 32字节)
                int    restHeadLength = 32;
                byte[] recvBytesHead  = new byte[restHeadLength];
                while (restHeadLength > 0)
                {
                    byte[] recvBytes1      = new byte[32];
                    int    alreadyRecvHead = 0;
                    if (restHeadLength >= recvBytes1.Length)
                    {
                        alreadyRecvHead = _client.Receive(recvBytes1, recvBytes1.Length, 0);
                    }
                    else
                    {
                        alreadyRecvHead = _client.Receive(recvBytes1, restHeadLength, 0);
                    }
                    recvBytes1.CopyTo(recvBytesHead, recvBytesHead.Length - restHeadLength);
                    restHeadLength -= alreadyRecvHead;
                }

                //接收消息体(消息体的长度存储在消息头的4至8索引位置的字节里)
                byte[] bytes = new byte[4];
                Array.Copy(recvBytesHead, 4, bytes, 0, 4);
                int    restBodyLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(bytes, 0));
                byte[] recvBytesBody  = new byte[restBodyLength];
                while (restBodyLength > 0)
                {
                    byte[] recvBytes2      = new byte[restBodyLength < 1024 ? restBodyLength : 1024];
                    int    alreadyRecvBody = 0;
                    if (restBodyLength >= recvBytes2.Length)
                    {
                        alreadyRecvBody = _client.Receive(recvBytes2, recvBytes2.Length, 0);
                    }
                    else
                    {
                        alreadyRecvBody = _client.Receive(recvBytes2, restBodyLength, 0);
                    }
                    recvBytes2.CopyTo(recvBytesBody, recvBytesBody.Length - restBodyLength);
                    restBodyLength -= alreadyRecvBody;
                }

                //解析
                NetworkInfo info = new NetworkInfo();
                info.Fill(recvBytesHead, recvBytesBody);
                if (ReceiveMessageEvent != null)
                {
                    ReceiveMessageEvent(info);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 发送消息
        /// </summary>
        public void SendInfo(NetworkInfo info)
        {
            if (IsConnect)
            {
                byte[] sendBytes = info.ToByte();
                _sendDataBuffer.Add(sendBytes);

                if (!_isSending)
                {
                    StartCoroutine(SendInfoCoroutine(sendBytes));
                }
            }
            else
            {
                GlobalTools.LogError("发送消息失败:客户端已断开连接!");
            }
        }