2014-11-07 1 views
1

Я работаю с сетевыми сокетами, большинство из которых связано с Windows Forms, но я просмотрел множество программ, таких как эмуляторы частных серверов, и я не удовлетворен моя обработка пакетов.Альтернатива работе с пакетом пакетов с коммутацией

Каждое сообщение имеет формат, в JSON, например, так:

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

«Идентификатор» является постоянным во всех пакетах, и он идентифицирует функцию пакета. Пакеты одного и того же идентификатора, отныне известные как заголовок, всегда будут иметь одинаковые ключи, но не обязательно одинаковые значения (например, говорит кто-то).

Я десериализации JSON в динамичную и выполнить дело переключателя на заголовок пакета, например, так:

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

Учитывая, что это очень мелкосерийное приложение чата, который не будет даже почти начать пытаться реализовать все функции IRC, должен ли я быть обеспокоен и недоволен моей реализацией? Малые игры/серверы testbench используют тот же метод, но я не хочу ограничивать себя с точки зрения функциональности и производительности, или если это становится неприятностью.

Любые мысли помогут.

+0

Вы не сказали нам, что не так с подходом 'switch' /' case'. И вы нам очень мало помогли, что для вас лучший подход. – Enigmativity

+0

Я полагаю, что мой вопрос действительно о релевантности этого кода. Я знаю, что это сработает, но будет ли оно работать _best_ для моих целей, учитывая, что я видел, что другие подобные приложения используют подход использования делегатов и словарей. Но на это ответили! – Fuselight

ответ

7

Использование переключателя создает довольно эффективный код, поэтому вы не будете ограничивать себя с точки зрения производительности. Это также довольно чистый код в том смысле, что большинство читателей с основным пониманием языка смогут выяснить, что происходит.

Другая распространенная альтернатива коммутаторам - ассоциативный контейнер делегатов. Вы можете сделать это следующим образом:

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> более конкретным типом вместо объекта или полностью передать другой набор параметров, если вы решите получить больше данных из пакета перед отправкой в ​​обработчик действий.

+0

Спасибо. Это именно тот ответ, который я ищу. Я видел подобные подходы, подобные этим, используемым в игровых серверах, и я предполагаю, что это была комбинация беспокойства и ревности, которые я ощущал. Но теперь, когда я понимаю этот подход, я могу использовать его вместо этого :) – Fuselight

 Смежные вопросы

  • Нет связанных вопросов^_^