【问题标题】:Alternative to Switch-Case Packet HandlingSwitch-Case 数据包处理的替代方案
【发布时间】:2014-11-07 11:31:31
【问题描述】:

我一直在玩弄网络套接字,我的大部分问题都来自 Windows 窗体,但我研究了很多程序,例如私有服务器模拟器,我对自己的数据包处理感到不满意。

每条消息都采用 JSON 格式,如下所示:

{
"id":201,
"Message":"Hello, World.",
"User":"System",
"Color":"LawnGreen"
}

“id”在所有数据包中都是一个常数,它将标识数据包的功能。具有相同 ID 的数据包,此后称为标头,将始终具有相同的键,但不一定具有相同的值(呃,有人说)。

我将 JSON 反序列化为动态并在数据包的标头上执行 switch case,如下所示:

switch((int)jsonPacket.id)
{
    case 201:
    ...
}

鉴于这是一个非常小规模的聊天应用程序,甚至几乎不会开始尝试实现 IRC 的所有功能,我是否仍然对我的实现感到担忧和不满意?小型游戏/测试台服务器使用相同的方法,但我不想在功能和性能方面限制自己,或者它是否会成为麻烦。

任何想法都会有所帮助。

【问题讨论】:

  • 您还没有告诉我们switch/case 方法有什么问题。在更好的方法对您意味着什么方面,您几乎没有告诉我们。
  • 我想我的问题实际上是关于这段代码的相关性。我知道它会起作用,但考虑到我已经看到其他类似的应用程序使用使用委托和字典的方法,它会为我的目的工作最佳。但是已经回答了!

标签: c# json sockets switch-statement packet


【解决方案1】:

使用开关会产生相当高效的代码,因此您不会在性能方面限制自己。它也是一个相当干净的代码,因为大多数对该语言有基本了解的读者都能够弄清楚发生了什么。

开关的另一种常见替代方法是委托的关联容器。你可以这样:

private static readonly IDictionary<int,Action<object>> processor =
    new Dictionary<int,Action<object>>
{
    { 201, Process201 }
,   { 205, Process205 }
};
...
static void Process201(object message) {
    // Do something
}
static void Process205(object message) {
    // Do something else
}

现在你可以像这样使用这个数组了:

processor[jsonPacket.id](jsonPacket);

这将根据数据包中的 ID 调用适当的方法。您可以使Action&lt;T&gt; 采用更具体的类型而不是对象,或者如果您决定在分派到操作处理程序之前从数据包中获取更多数据,则完全传递一组不同的参数。

【讨论】:

  • 谢谢。这正是我正在寻找的答案。我在游戏服务器中看到过类似的方法,我想这是我感到的担心和嫉妒的结合。但是现在我理解了这种方法,我最终可能会改用它:)
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2011-01-19
相关资源
最近更新 更多