/// <summary> /// 发包[发送Tcp包/发送Udp数据报] /// </summary> /// <param name="packet"></param> public override void SendMessage(NetPacket packet) { if (packet == null || packet.Command == null || packet.PacketHead == null) return; #region【计算包体长度】 packet.PacketHead.Len = GetCanSerializableObjectSize(packet.Command); #endregion #region【写入包头】 if (this.IsNetStreamCanWrite) { _netStream.Write(BitConverter.GetBytes(packet.PacketHead.Version), 0, Marshal.SizeOf(packet.PacketHead.Version)); _netStream.Write(BitConverter.GetBytes((Int32)packet.PacketHead.PType), 0, sizeof(Int32)); _netStream.Write(BitConverter.GetBytes(packet.PacketHead.Len), 0, Marshal.SizeOf(packet.PacketHead.Len)); } #endregion #region【写入包体】 byte[] buffer = null; using (MemoryStream m = new MemoryStream()) { SerializeHelper<BinarySerializeHelper>().Serialize(m, packet.Command); m.Position = 0; buffer = new byte[m.Length]; m.Read(buffer, 0, (Int32)m.Length); } if (buffer != null && this.IsNetStreamCanWrite) _netStream.Write(buffer, 0, buffer.Length); #endregion }
/// <summary> /// 发包 /// </summary> /// <param name="packet"></param> public override void SendMessage(NetPacket packet) { if (packet == null || packet.Command == null || packet.PacketHead == null) return; if (OnBeforeSendPacket != null) OnBeforeSendPacket(packet); MemoryStream mStream = new MemoryStream(); try { #region【计算包体长度】 if (packet.PacketHead.Len == 0) { packet.PacketHead.Len = GetCanSerializableObjectSize(packet.Command); } #endregion #region【写入包头】 mStream.Write(BitConverter.GetBytes(packet.PacketHead.Version), 0, Marshal.SizeOf(packet.PacketHead.Version)); mStream.Write(BitConverter.GetBytes((Int32)packet.PacketHead.PType), 0, sizeof(Int32)); mStream.Write(BitConverter.GetBytes(packet.PacketHead.Len), 0, Marshal.SizeOf(packet.PacketHead.Len)); #endregion #region【写入包体】 byte[] buffer = null; using (MemoryStream m = new MemoryStream()) { SerializeHelper<BinarySerializeHelper>().Serialize(m, packet.Command); m.Position = 0; buffer = new byte[m.Length]; m.Read(buffer, 0, (Int32)m.Length); } mStream.Write(buffer, 0, buffer.Length); #endregion #region【将内存流一次写入网络流,异步写入】 mStream.Seek(0, SeekOrigin.Begin); _netStream.BeginWrite(mStream.GetBuffer(), 0, (Int32)mStream.Length, new AsyncCallback(AsyncCallbackWriteToNetStream), new WriteNetStreamASyncCallbackParam { NetStream = _netStream, Packet = packet }); #endregion } catch (Exception e) { NetServiceErrorReason reason = new NetServiceErrorReason(); reason.Exception = e.InnerException ?? e; reason.SendData = packet.Command.Data; this.SendErrorHandler(reason); } mStream.Close(); }
/// <summary> /// 创建数据包 /// </summary> private NetPacket CreateNetPacket(string topicName, object data) { ICommand command = new PublishCommand(); command.Data = data; command.TopicName = topicName; NetPacket packet = new NetPacket(); packet.Command = command; return packet; }
private void ClientReceivedPacket(NetPacket packet) { if (packet != null && packet.Command != null) { if (packet.Command is ServerClosed) // 服务端断开 { OnServerClosed(new EventArgs()); LogManger.Warn("服务端断开连接", this.GetType()); } else if (packet.Command.Data != null) { OnOnReceiveMessageEventHandler(packet.Command.Data); } } }