Вопросы по Java Instant Messenger - PullRequest
       36

Вопросы по Java Instant Messenger

3 голосов
/ 07 февраля 2012

Я хочу построить мессенджер на Java.

  1. Клиенты подключатся к серверу для входа в систему.
  2. Они начнут разговор с одним или несколькими другими клиентами..
  3. Затем они будут отправлять сообщения на сервер, который будет передавать сообщения всем клиентам.

Клиент должен постоянно обновляться, когда пользователи публикуют сообщения или входят в систему.

так, как я понимаю, клиент должен сам запустить сервер в отдельном потоке, чтобы основной сервер мог отправлять на него данные.В противном случае клиент должен будет опросить главный сервер каждые xyz секунды, чтобы получить последние обновления.И для этого в любом случае потребуется отдельный поток, так как он предназначен исключительно для получения обновлений, тогда как «основной» поток будет использоваться для того, когда клиент инициирует такие действия, как отправка сообщений / приглашение других к беседам и т. Д.

Так кто-нибудь рекомендации, как написать этот мессенджер?Разве это не хорошая идея сделать соединение «двусторонним», когда и клиент, и сервер выступают в роли серверов?Или опрос лучше?Кто-нибудь знает, как протокол IRC делает это?

Ответы [ 4 ]

1 голос
/ 07 февраля 2012

Нет реального преимущества иметь 2 соединения, если они не могут быть обработаны независимо (например, получение / отправка файла обычно выполняется в отдельном соединении). Само соединение уже является двусторонним каналом связи, поэтому его можно использовать как для отправки, так и для получения сообщений, событий и т. Д. Вам не нужно опрашивать сервер, поскольку клиент может поддерживать постоянное соединение и просто ждать появления данных ( при необходимости отправка периодического PING-подобного сообщения, чтобы убедиться, что соединение активно).

IRC использует одно соединение с сервером для обмена текстовыми командами. Например, одна из основных команд:

PRIVMSG <msgtarget> <message>

Эта команда может быть создана клиентом или сервером. Клиент отправляет PRIVMSG, чтобы уведомить, что он хочет доставить сообщение одному или нескольким получателям (в IRC это либо пользователь (ы), либо канал (ы)). Задача сервера - правильно передать это сообщение соответствующим клиентам.

1 голос
/ 07 февраля 2012

Если вы используете необработанные потоки InputOutput, то да, это хороший способ сделать это.Вы создаете один поток на стороне клиента, который действует аналогично серверному потоку - ожидает любых входящих обновлений и, когда он это делает, обновляет клиента.Я бы не назвал это сервером.Таким образом, в идеале у вас должно быть 2 TCP / UDP-соединения, одно для запросов, сделанных клиентом, и одно для уведомления клиента об изменениях сервера.

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

0 голосов
/ 09 декабря 2014

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

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

0 голосов
/ 07 февраля 2012

Вам нужен полностью настраиваемый протокол или будет достаточно использовать XMPP? Существует несколько библиотек с открытым исходным кодом, реализующих XMPP. http://xmpp.org/xmpp-software/libraries/

например. http://www.igniterealtime.org/projects/smack/

...