Что лучше для instant messenger TCP или UDP?

Мне нужно реализовать клиент / сервер instant messenger, используя чистые сокеты в Java lang.
Сервер должен обслуживать большое количество клиентов, и мне нужно решить, какие сокеты я должен использовать-TCP или UDP.
Спасибо, Коста.

4 ответов


TCP

причина:

TCP: "существует абсолютная гарантия того, что передаваемые данные остаются нетронутыми и поступают в том же порядке, в котором они были отправлены."

UDP: "нет никакой гарантии, что отправленные сообщения или пакеты достигнут вообще."

подробнее: http://www.diffen.com/difference/TCP_vs_UDP

вы хотите, чтобы ваше сообщение в чате возможно потеряно?

редактировать: я пропустил часть о "большой программе чата". Я думаю, что из-за характера программы чата это должен быть TCP-сервер, я не могу представить фактический текстовый контент, отправленный пользователями по протоколу UDP.

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


вы можете использовать оба. Используйте TCP для обмена фактическими сообщениями (поэтому нет потерянных данных и потоковых больших сообщений, (например. содержащ jpegs etc), возможно. Используйте UDP только для отправки коротких сообщений connectNow клиентам, для которых есть сообщения в очереди. Клиенты могут иметь такие состояния, как (NotLoggedIn, TCPconnected, TCPdisconnected, LoggedOut) с различными таймаутами для управления переходами состояний, а также обычными событиями обмена сообщениями. Сообщение UDP 'connectNow' будет проинструктируйте клиентов в "TCPdisconnected" для подключения и поэтому перейдите к "TCPconnected", где они останутся, обмениваясь сообщениями, пока какой-то таймер бездействия не попросит клиента отключиться на данный момент. Это, конечно, было бы ненадежно, и поэтому вы можете повторить сообщение "connectNow" каждые X секунд в течение N раз, пока клиент не подключится. Клиент должен, в любом случае, пытаться опросить каждые X минут, на всякий случай...


Это зависит от того, должен ли пользователь знать, были ли сообщения доставлены на сервер. UDP-пакеты не имеют собственного подтверждения. Если клиент отправляет сообщение IM на сервер и оно теряется в пути, ни клиент, ни сервер не будут знать об этом.

(короткий ответ: "использовать TCP" ... но стоит задуматься над тем, как это отразится на вашем дизайне.)


TCP даст вам надежность, что, безусловно, желательно, когда во время обмена мгновенными сообщениями-вы не хотите, чтобы сообщения отбрасывались во время converstation.

однако, если вы собираетесь использовать групповые сообщения, то вы можете в конечном итоге использовать mulitcast. Для таких случаев UDP будет правильным chioce, так как UDP может обрабатывать точку к многоточечному. Использование TCP для многоадресных приложений было бы сложно, так как теперь отправителю пришлось бы отслеживать скорость ретрансляции / отправки для несколько приемников. Одной из альтернатив может быть использование TCP для чата "точка-точка" и использование UDP для групповых сообщений.