Сервер без блокировки и потокобезопасный - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть сервер, который использует один поток для получения UDP DatagramPackets из удаленного источника данных;и TCP ServerSocket для прослушивания запросов удаленных клиентов и создания выделенного потока для каждого клиента.Я хочу передать каждый DatagramPackets через ServerSocket нескольким клиентам.И теперь я столкнулся со значительной потерей пакетов.Кто-нибудь может дать совет?Спасибо заранее。

Ответы [ 3 ]

0 голосов
/ 12 ноября 2010

Было бы более целесообразно избавиться от UDP у отправителя , а не пытаться каким-то образом вставить его в свой дизайн TCP на приемнике, где уже слишком поздно.Пакеты теряются между отправителем и получателем, а не в вашем получателе.Исправление кода получателя не решит проблему.

0 голосов
/ 12 ноября 2010

Не зная ничего о дизайне вашего приложения, я могу сделать следующие предположения:

  • Ваш UDP-источник отправляет больше пакетов, чем может обработать получатель, в результате чего пакеты отбрасываются, потому что
  • ваш получатель блокируется при передаче пакетов клиентам TCP, потому что
  • ваши клиенты TCP не получают пакеты достаточно быстро, что приводит к заполнению буфера (что заставляет сервер блокировать, что приводит к пропуску пакетов UDP).
0 голосов
/ 12 ноября 2010

Может ли быть просто неправильный выбор протоколов в дизайне? Что-то должно быть надежным для нескольких клиентов, так как вы используете TCP. Но надежность не удалась из-за введенной зависимости от UDP-сквозного соединения (мост / ретрансляция) на стороне сервера.

UDP более или менее применим для надежных приложений, если принять во внимание, что пакеты будут потеряны по проекту.

  • Решение 1: изменить протокол
  • Решение 2: если невозможно изменить протокол, измените ожидания пользователя на стороне клиента относительно качества обслуживания
  • Решение 3: добавьте избыточность на стороне UDP для повторения запросов, заблаговременно сохраняйте данные, ожидая будущих падений качества, сохраняйте большой накопленный кеш данных для подачи клиентам независимо от того, что.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...