C #: Вопрос о программировании сокетов (синхронизация или асинхронность) - PullRequest
4 голосов
/ 21 марта 2011

Я пишу сервер обмена мгновенными сообщениями на C # в учебных целях.Мой вопрос заключается в том, должен ли я использовать синхронные или асинхронные сокеты для обработки IM-клиентов.Цель состоит в том, чтобы обработать как можно больше клиентов.

Я не совсем уверен, но насколько я знаю, с асинхронными сокетами пакеты не приходят в порядке, что означает, что когда вы отправляете 2 сообщения чата и тамэто задержка / задержка, возможно, что второй прибудет раньше первого.Правильно ли это, и если да, есть ли способ решить эту проблему?

О сокетах синхронизации: Является ли синхронные сокеты хорошим решением для многих клиентов?Нужно ли проверять каждый сокет / соединение в цикле, если есть новые пакеты?Если да, разве это не так медленно?

Последний вопрос: Предположим, я хочу реализовать способ отправки файлов (например, изображений) по протоколу (кстати, это нестандартный двоичный протокол), могу ли яотправлять сообщения при загрузке?

Ответы [ 3 ]

8 голосов
/ 21 марта 2011

Цель состоит в том, чтобы обслуживать как можно больше клиентов.

Асинхронно.Это масштабируется намного лучше.

Я не совсем уверен, но насколько я знаю с асинхронными сокетами, пакеты не приходят в порядке, что означает, что когда вы отправляете 2 сообщения чата, и естьзадержка / задержка возможно, что второй прибывает перед первым.

TCP гарантирует, что все поступает в порядке.

Предположим, я хочу реализовать способ отправкифайлы (например, изображения) через протокол (который является нестандартным двоичным протоколом между прочим), могу ли я отправлять сообщения во время загрузки

Я рекомендую использовать отдельное соединение для передачи файлов.Используйте первое соединение для установления связи (определите, какой порт использовать, укажите имя файла и т. Д.).Затем используйте Socket.SendFile на новом сокете для передачи файла.

4 голосов
/ 21 марта 2011

Все, что сказал @jgauffin (т. Е. TCP обрабатывает порядок пакетов, асинхронный лучше для n(clients) > 1000).

Предположим, я хочу реализовать способ отправки файлов (например, изображений) через протокол (который является нестандартным двоичным протоколом (кстати), могу ли я отправлять сообщения во время загрузки?

Ваш собственный протокол должен быть создан для поддержки этого.Если вы записываете 8-мегабайтный пакет в Socket, вы не сможете писать что-либо еще, используя этот сокет, пока не отправите 8-мегабайтный пакет.Вместо этого используйте загрузочные чанки меньшего размера, чтобы другие пакеты также могли проходить через канал.

[UPLOAD  id=123 START length=8012389]
[UPLOAD  id=123 PART chunk=1 length=2048 data=...]
[UPLOAD  id=123 PART chunk=2 length=2048 data=...]
[MESSAGE to="foo@example.com" text="Hi"]
[UPLOAD  id=123 PART chunk=3 length=2048 data=...]
// ...
[UPLOAD  id=123 COMPLETE checksum=0xdeadbeef]
2 голосов
/ 21 марта 2011

Разница между асинхронным подходом и синхронизированным подходом больше связана с различием между неблокирующим и блокирующим io. При обоих подходах данные доставляются в том же порядке, в котором они были переданы. Однако вы не блокируете время ожидания завершения асинхронного вызова, поэтому вы можете начать передачу всем своим клиентам до того, как какая-либо отдельная связь завершит запись в сокет (именно поэтому обычно это подход затем следуют серверы).

Если вы идете по маршруту синхронизации, вы блокируете до тех пор, пока не завершится каждая операция приема / передачи, а это значит, что может потребовать запуска нескольких потоков для обработки клиентов.

Что касается загрузки изображения одновременно с отправкой сообщений, вам может потребоваться обработать это по другому каналу связи между клиентом и сервером, чтобы он не вызывал блокировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...