Packet Sender
Trên trang này
Namespace: Nalix.Runtime.Dispatching
Assembly: Nalix.Runtime
PacketSender (public sealed class PacketSender : IPacketSender) là triển khai runtime mặc định của IPacketSender, gắn với mỗi PacketContext<TPacket> có pool và được cung cấp qua context.Sender.
Ánh xạ mã nguồn
src/Nalix.Abstractions/Networking/Packets/IPacketSender.cssrc/Nalix.Runtime/Dispatching/PacketSender.cssrc/Nalix.Runtime/Extensions/ConnectionExtensions.cs
Cách PacketSender định tuyến và biến đổi gói tin đi ra
Khi SendAsync hoặc ReplyAsync được gọi:
- Chọn transport (
GetTransport):- Nếu handler có
[PacketTransport(NetworkTransport.UDP)], chọnconnection.UDP(némInvalidOperationExceptionnếu transport UDP đi kèm chưa được khởi tạo). - Nếu
[PacketTransport]chỉ địnhTCPhoặcWEBSOCKET, chọnconnection.TCP. - Nếu không có
[PacketTransport], phản hồi trênconnection.UDPkhi yêu cầu đến qua UDP (!context.IsReliable && connection.UDP is not null), ngược lại dùngconnection.TCP.
- Nếu handler có
- Quyết định mã hóa:
SendAsync(packet, ct)dùngneedEncrypt = context.Attributes.Encryption?.IsEncrypted ?? false(từ[PacketEncryption]).SendAsync(packet, forceEncrypt, ct)ghi đè chính sách của attribute bằngforceEncrypt.
- Tuần tự hóa & biến đổi khung:
- Tuần tự hóa
packetvào mộtBufferLeasecó pool quaPacketPipeline.Serialize(packet, zeroOnDispose: needEncrypt). - Gọi
PacketPipeline.ProcessAndSendAsyncvớiCompressionOptions.EnabledvàCompressionOptions.MinSizeToCompress, áp dụng nén LZ4 (khi có lợi) và mã hóa AEAD/đối xứng trước khi gửi trên transport đã chọn. - Dispose
BufferLeasemột cách xác định trên cả đường hoàn tất đồng bộ lẫn bất đồng bộ.
- Tuần tự hóa
Phương thức công khai (IPacketSender)
| Phương thức | Chữ ký | Mô tả |
|---|---|---|
ReplyAsync | public ValueTask ReplyAsync(IPacket response, CancellationToken ct = default) | Sao chép SequenceId của yêu cầu đến sang response.Header.SequenceId (để client RequestAsync / StreamAsync ghép cặp) rồi gọi SendAsync(response, ct). |
SendAsync (policy mặc định) | public ValueTask SendAsync(IPacket packet, CancellationToken ct = default) | Tuần tự hóa và gửi packet theo metadata [PacketEncryption] và [PacketTransport] của handler, không thay đổi packet.Header.SequenceId. |
SendAsync (mã hóa tường minh) | public ValueTask SendAsync(IPacket packet, bool forceEncrypt, CancellationToken ct = default) | Tuần tự hóa và gửi packet với ghi đè forceEncrypt tường minh. |
Initialize<TPacket> | public void Initialize<TPacket>(IPacketContext<TPacket> context) where TPacket : IPacket | Gắn sender với context (được PacketContext<TPacket>.Initialize gọi tự động). |
ResetForPool | public void ResetForPool() | Xóa trạng thái kết nối, metadata, token và sequence khi PacketContext<TPacket> được trả về pool. |
Ví dụ sử dụng
using System.Threading.Tasks;
using Nalix.Abstractions.Networking.Packets;
using Nalix.Codec.Pooling;
[PacketOpcode(0x1010)]
[PacketEncryption(true)]
public async ValueTask HandleOrder(IPacketContext<OrderRequestPacket> context)
{
using PacketScope<OrderAckPacket> lease = PacketFactory<OrderAckPacket>.Acquire();
OrderAckPacket ack = lease.Value;
ack.Initialize(orderId: 9001);
// ReplyAsync tự động gán ack.Header.SequenceId = context.Packet.Header.SequenceId
await context.Sender.ReplyAsync(ack, context.CancellationToken);
}