/// <summary> /// 协议格式: /// SIZE : 4 | TYPE : 4 | MsgID : 4 | PACKET : dynamic /// </summary> /// <typeparam name="T">向服务器发送的packet的类型</typeparam> /// <param name="networkMessage">向服务器发送的请求的类型</param> /// <param name="packet">向服务器发送的packet</param> private void DoBeginSendPacket <T>(ENetworkMessage networkMessage, T packet, byte[] msgID) where T : global::ProtoBuf.IExtensible { try { byte[] sendBuffer = new byte[_socket.SendBufferSize]; MemoryStream streamForProto = new MemoryStream(); Serializer.Serialize <T>(streamForProto, packet); int bufferSize = HEAD_SIZE * HEAD_NUM + (int)streamForProto.Length; byte[] bufferSizeBytes = MiniConverter.IntToBytes(bufferSize); byte[] networkMessageBytes = MiniConverter.IntToBytes((int)networkMessage); Array.Copy(bufferSizeBytes, 0, sendBuffer, HEAD_SIZE * 0, HEAD_SIZE); Array.Copy(networkMessageBytes, 0, sendBuffer, HEAD_SIZE * 1, HEAD_SIZE); Array.Copy(msgID, 0, sendBuffer, HEAD_SIZE * 2, HEAD_SIZE); Array.Copy(streamForProto.ToArray(), 0, sendBuffer, HEAD_SIZE * HEAD_NUM, streamForProto.Length); lock (_socket) { if (_socket != null && _socket.Connected) { _socket.BeginSend(sendBuffer, 0, bufferSize, SocketFlags.None, new AsyncCallback(EndSendPacket), null); } } streamForProto.Dispose(); } catch (ObjectDisposedException) { Log4U.LogInfo("Send Closed"); } catch (Exception ex) { Log4U.LogError(ex.Message); } }
private void DoBeginSendPacket(ENetworkMessage networkMessage, byte[] msgID) { try { byte[] sendBuffer = new byte[HEAD_SIZE * HEAD_NUM]; byte[] bufferSizeBytes = MiniConverter.IntToBytes(HEAD_SIZE * HEAD_NUM); byte[] networkMessageBytes = MiniConverter.IntToBytes((int)networkMessage); Array.Copy(bufferSizeBytes, 0, sendBuffer, HEAD_SIZE * 0, HEAD_SIZE); Array.Copy(networkMessageBytes, 0, sendBuffer, HEAD_SIZE * 1, HEAD_SIZE); Array.Copy(msgID, 0, sendBuffer, HEAD_SIZE * 2, HEAD_SIZE); lock (_socket) { _socket.BeginSend(sendBuffer, 0, HEAD_SIZE * HEAD_NUM, SocketFlags.None, new AsyncCallback(EndSendPacket), null); } } catch (Exception ex) { Log4U.LogError(ex.Message); } }