Tài liệu

Packet Handlers

Thời gian đọc 2 phút
Trên trang này

Packet handler là nơi chứa logic ứng dụng của bạn — mỗi opcode một method, được gọi tự động khi gói tin tương ứng đến.

Mẫu cơ bản: phản hồi trên cùng kết nối

// samples/HelloWorld/HelloWorld.Server/HelloHandlers.cs
[PacketController("HelloWorld.Greetings")]
public static class HelloHandlers
{
    [PacketOpcode(0x7001)]
    public static async ValueTask HandleHelloAsync(IPacketContext<HelloRequestPacket> context)
    {
        using PacketScope<HelloResponsePacket> lease = PacketFactory<HelloResponsePacket>.Acquire();
        HelloResponsePacket response = lease.Value;
        response.Message = 1;

        await context.Sender.ReplyAsync(response).ConfigureAwait(false);
    }
}

[PacketController("...")] đánh dấu lớp ([PacketHandler] đã lỗi thời); [PacketOpcode(0x7001)] ánh xạ một method với một opcode. IPacketContext<TPacket> cung cấp gói tin đã giải tuần tự hóa và một Sender để phản hồi. Dùng PacketFactory<T>.Acquire() để lấy một instance có pool thay vì cấp phát mới — luôn bọc nó trong khối using để nó được trả về pool.

Mã nguồn đầy đủ: samples/HelloWorld/HelloWorld.Server/HelloHandlers.cs

Phát sóng thay vì phản hồi

// samples/ChatRoom/ChatRoom.Server/ChatHandlers.cs
[PacketController("ChatRoom.Chat")]
public static class ChatHandlers
{
    [PacketOpcode(0x7101)]
    public static async ValueTask HandleChatAsync(IPacketContext<ChatMessagePacket> context)
    {
        ArgumentNullException.ThrowIfNull(context);

        IConnectionBroadcaster? hub = InstanceManager.Instance
            .GetExistingInstance<IConnectionBroadcaster>();

        if (hub is null)
        {
            return;
        }

        await hub.BroadcastAsync(context.Packet).ConfigureAwait(false);
    }
}

Thay vì gọi context.Sender.SendAsync(...), handler này lấy IConnectionBroadcaster và gửi gói tin đến mọi client đang kết nối.

Mã nguồn đầy đủ: samples/ChatRoom/ChatRoom.Server/ChatHandlers.cs

Đăng ký handler

Cả hai mẫu đều đăng ký lớp handler theo cùng một cách, trên server builder:

NetworkApplication.CreateBuilder()
    .MapHandlers(typeof(HelloHandlers))
    // ...
    .Build();

Bước tiếp theo