2013-06-28 3 views
8

У меня есть рабочий пример Websockets, где клиенты получают сообщения с сервера.Как отправить старые сообщения с помощью Websockets

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

Пример:

  • Каждый клиент подает свое имя при подключении
  • Сервер отвечает «[имя] просто подключен» (для всех клиентов)
  • Любые новые клиенты не получают бы эти сообщения

Мне интересно, могут ли клиенты получать старые сообщения (либо все из них, либо сообщения за последние 5 минут будут приемлемыми).

Я подозреваю, что мне, возможно, придется самому захватить эту информацию, хранить ее где-нибудь (например, базу данных) и отправлять сообщения новым клиентам. Это правильно, или я что-то упускаю?

Если у кого-то есть псевдокод или ссылка на пример того, как другие это реализовали, это было бы удобно.

+0

Разве это не так просто, как сервер отправляет список подключенных в данный момент клиентов к любому новому клиенту? – JeffRSon

+0

@JeffRSon Я хочу иметь возможность отправлять любые произвольные данные. –

+0

Я не уверен, имеет ли смысл отправлять устаревшие сообщения. Предположим, что клиент подключился и отключился. Вы отправите оба сообщения любому новому клиенту? Или вы знаете, что отключенное сообщение должно «удалить» предыдущее подключенное сообщение? Если это не для ведения журнала, вы должны отправлять только текущее состояние. И для ведения журнала вам нужно сохранить всю кучу сообщений, чтобы отправить их, но только один раз. – JeffRSon

ответ

4

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

Кстати, с какой стороны вы используете сервер? (Node, Erlang и т.д.)

Вы можете проверить следующую ссылку, если вы используете node.js

http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial

+0

Gah. Это раздражает. Я надеялся избежать этого, найдя некоторую превосходную «очередь сообщений», скрытую в реализации Websocket. Да, я использую узел. –

+0

:) Не супер супер «очередь сообщений» реализована. Однако, если вы хотите, чтобы очередь сообщений была простой, вы можете легко использовать RabbitMQ или другую очередь обмена сообщениями. –

+0

можно было бы здесь: http://stackoverflow.com/questions/26056688/get-past-messages-from-websocket –

2

Вы могли бы сделать что-то вроде этого:

  1. Каждое сообщение должно иметь id ->muid (Сообщение Уникальный ID)
  2. Каждый раз, когда клиент отправляет сообщение sa, он получает ACK с сервера вместе с muid для отправленного сообщения.
  3. Каждый раз, когда новое сообщение принимается на стороне сервера, назначается muid, отправляется с ACK, а также отправляется с сообщением каждому подключенному пользователю. Таким образом, представление сможет представить для каждого пользователя одну и ту же последовательность в какой-то момент времени.
  4. Каждый раз, когда новый пользователь подключается, он отправляет последнее muid, которое оно получило, поэтому сервер знает, где этот пользователь перестает получать сообщения. Сервер может затем отправить стольких старых сообщения, как вы хотите, в зависимости от вида хранения вы реализуете:
    1. Полная история: Я бы рекомендовал для хранения базы данных с правильной индексацией
    2. последних N сообщений: В зависимости от размера N вы можете просто сохранить последние N сообщений в массиве с фиксированным размером и отправить их, все или необходимый фрагмент, при каждом повторном подключении. Имейте в виду, что это будет потреблять память, поэтому сохранение последних 1024 сообщений для 1024 разных чатов будет иметь довольно много памяти, особенно если сообщения имеют неограниченный размер.

Надеется, что это помогает