it-roy-ru.com

Записываете масштабируемый TCP/IP сервер на C # 5 с шаблоном async/await?

Мне поручено разработать довольно простой TCP/IP-сервер, который должен принимать соединения от нескольких клиентов. Это должно быть написано на C #, и я использую .NET 4.5. Тем не менее, я не уверен, каково текущее «состояние дел» для масштабируемости TCP/IP сервер/клиент в .NET 4.5.

Я видел этот пост: Как написать масштабируемый сервер на базе Tcp/Ip . Но это относится к .NET 2.0 и 3.5 и не упоминает шаблон async/await.

Я способен написать сервер «по-старому» ... но я хочу знать, что такое «новый способ».

  • Каков наилучший способ использования новых методов Async в Socket, TcpClient или TcpListener для создания масштабируемого сервера в C #?
  • Используют ли новые методы Async порты завершения ввода/вывода?
  • Является ли использование собственного слушателя Socket более эффективным, или классы TcpListener/TcpClient сейчас достаточно хороши?

Правка: Дополнительные вопросы.

23
Ben Lesh

Каков наилучший способ использования новых методов Async в Socket, TcpClient или TcpListener для создания масштабируемого сервера в C #?

На async нет новых методов Socket; методы с именем *Async на Socket представляют собой специальный набор API для уменьшения использования памяти. TcpClient и TcpListener получили несколько новых методов async.

Если вам нужна лучшая масштабируемость, лучше всего использовать пользовательские ожидающие Стивена Туба для Socket . Если вы хотите проще всего кодировать, вам, вероятно, лучше использовать TcpClient и TcpListener.

Используют ли новые методы Async порты завершения ввода/вывода?

Да, как и большинство других асинхронных API в BCL. AFAIK, класс Stream является единственным классом, который может не использовать IOCP; все другие методы *Begin/*End/*Async используют IOCP.

Является ли использование собственного слушателя Socket более эффективным, или классы TcpListener/TcpClient сейчас достаточно хороши?

Классы довольно хорошие, как они есть. У Стивена Туба есть сообщение в блоге , которое немного более эффективно с точки зрения использования памяти.

10
Stephen Cleary

В .net4.5 вы можете использовать ключевое слово async/await для создания tcp-сервера . Вот пример кода . async await tcp server

Может принимать более 10 тыс. Соединений .  tcp server

0
Jianchen Ding