/// <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); } } }
/// <summary> /// 发送消息 /// </summary> public void SendInfo(NetworkInfo info) { if (IsConnect) { byte[] sendBytes = info.ToByte(); _sendDataBuffer.Add(sendBytes); if (!_isSending) { StartCoroutine(SendInfoCoroutine(sendBytes)); } } else { GlobalTools.LogError("发送消息失败:客户端已断开连接!"); } }