Пример #1
0
        public void SendObjectPacket(ObjectPacket packet, bool encrypt, bool compress = false)
        {
            // Invoke the following generic method here to enable AOT
            //   public static byte[] Serialize<T>(T value, MessagePackSerializerOptions options = null, CancellationToken cancellationToken = default);

            MethodInfo genericSerializeMethod;
            var        packetType = packet.GetType();

            if (!_GenericSerializeMethods.TryGetValue(packetType, out genericSerializeMethod))
            {
                genericSerializeMethod = SerializeMethod.MakeGenericMethod(packetType);
                _GenericSerializeMethods[packetType] = genericSerializeMethod;
            }

            _parameterCache2.Value[0] = packet;
            _parameterCache2.Value[1] = compress ? NetSettings.LZ4CompressOptions : NetSettings.MessagePackOptions;

            var data = genericSerializeMethod.Invoke(null, _parameterCache2.Value) as byte[];

            var size = data.Length + HeaderTailSize;

            var buffer = new MessageBuffer(size + (ServerSocket ? 4 : 2));

            if (ServerSocket)
            {
                buffer.Write(BitConverter.GetBytes((int)size), 4);
            }
            else
            {
                buffer.Write(BitConverter.GetBytes((ushort)size), 2);
            }

            buffer.Write(BitConverter.GetBytes(packet.PacketId), 4);
            buffer.Write(BitConverter.GetBytes(compress), 1);
            buffer.Write(data, data.Length);

            if (encrypt)
            {
                _authCrypt.EncryptSend(buffer.Data(), 0, SendHeaderSize);
            }

            SendPacket(buffer);
        }
Пример #2
0
        public void SendPacket(ByteBuffer packet)
        {
            if (_closed.Value)
            {
                return;
            }

            if (!packet.Empty && packet.Wpos() > 0)
            {
                var buffer = new MessageBuffer(packet.Wpos());
                buffer.Write(packet.Data(), packet.Wpos());
                QueuePacket(buffer);
            }
        }