簡體   English   中英

交換案例數據包處理的替代方法

[英]Alternative to Switch-Case Packet Handling

我一直在玩網絡套接字,大多數問題都來自Windows窗體,但是我研究了許多程序,例如私有服務器仿真器,但對數據包處理不滿意。

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

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

“ id”在所有數據包中都是一個常數,它將標識數據包的功能。 具有相同ID的數據包(此后稱為標頭)將始終具有相同的密鑰,但不一定具有相同的值(有人說,呵呵)。

我將JSON反序列化為動態格式,並在數據包的標頭上執行切換用例,如下所示:

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

鑒於這是一個很小規模的聊天應用程序,甚至幾乎不會開始嘗試並實現IRC的所有功能,我是否仍應對我的實現感到關注和不滿意? 小型游戲/測試台服務器使用相同的方法,但是我不想在功能和性能方面限制自己,或者不想讓它變得令人討厭。

任何想法都會有所幫助。

使用開關會產生相當有效的代碼,因此您不會在性能方面受到限制。 從某種意義上講,大多數對語言有基本了解的讀者都可以弄清楚發生了什么,這也是一個相當干凈的代碼。

開關的另一個常見替代方法是委托的關聯容器。 您可以這樣:

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<T>采取更特定的類型而不是對象,或者完全傳遞不同的參數集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM