【问题标题】:Where to handle my packets? [closed]在哪里处理我的数据包? [关闭]
【发布时间】:2013-10-23 19:18:37
【问题描述】:

如果您正在编写一个具有大量网络流量的大型程序,我在哪里可以最好地处理我的不同数据包?我的数据包包含一个连接到大枚举的数据包 ID。例如数据包 LOGIN_AUTH 是数据包 ID 23。

我怎样才能最好地分开处理这些数据包?

  • 用其中的所有数据包 ID 制作一个巨大的 switch 语句?
  • 创建一个 Packet 类并为每个 Packet ID 创建一个扩展类?

我正在用 C# 编写应用程序,但问题更笼统。

【问题讨论】:

标签: c# networking packet multiplayer payload


【解决方案1】:

假设您的对象有一个定义包类型的 int,使用枚举来命名这些整数并将处理程序存储在字典中很简单,如下所示:

public enum PackageType
{
    LOGIN_AUTH = 23,
    // More enum members here
}

class Package
{
    public int Id { get; set; }
    public PackageType Type { get { return (PackageType) Id; }}
}

class SomeClass
{
    IDictionary<PackageType, Action<Type>> _dictionaryPacketHandlers = new Dictionary<PackageType, Action<Type>>()
    {
        {PackageType.LOGIN_AUTH, package => { /* Logic here */ }},
        // More handlers here
    };
}

现在你可以像这样使用它了:

public void SomeMethod(Package package)
{
    _dictionaryPacketHandlers[package.Type](package);
}

【讨论】:

  • 他可能想根据枚举值来识别消息。只有一种类型包含简单网络请求等的消息标识符属性是有意义的。
  • myPacket 到底是什么?以及如何将新数据包插入 IDictionary?
  • @ByteBlast,你是对的 - 我已经修改了我的答案。巴萨,看看我修改后的答案。
  • 嗯...对不起,我完全迷路了。我从我的套接字接收数据,带有 ID 和有效负载(字符串)。假设类型是 LOGIN_AUTH。我如何处理该数据包,以及您示例中的逻辑如何访问我的有效负载?对不起,我真的不明白。我来自 Java,所以我从未使用过那些动作、委托、类型等......
猜你喜欢
  • 2012-02-28
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2017-01-07
  • 2020-09-18
  • 2014-02-02
相关资源
最近更新 更多