LINUX.ORG.RU

chat one to one как реализовать доставлено и прочитано?

 , ,


0

3

Как это лучше сделать? Допустим, юзер забирает сообщения(все) или >какой-то даты или по флагу «непрочитано». Далее(что первое приходит на ум) - это сделать апишку, в которую юзер будет после получения отдавать список ids всех полученных сообщений



Последнее исправление: Xwo (всего исправлений: 2)

зачем ему посылать обратно id-шники? Он же сделал запрос на получение сообщений, ты на сервере точно знаешь какие именно сообщения в респонзе ты ему отдал

gnunixon ★★★
()

список ids всех полученных сообщений

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

dsxl
()

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

Rastafarra ★★★★
()
Ответ на: комментарий от gnunixon

Сервер-то формирует данные, но коим образом он может знать, что данные клиент забрал?

В моем понимании клиент может точно знать, например при post, что данные сервер получил и обработал(сервер вернет статус код), а сервер откуда знает, долетели до клиента данные или нет?

Xwo
() автор топика
Ответ на: комментарий от Goury

А веб сокет не накладно по ресурсам? Все же клиенты поддерживают соединения с сервером, т.е подсаживаются на вебсокет. Не поплохеет инстансу, если на нём будут висеть 1000-10000 соединений?

Xwo
() автор топика
Ответ на: комментарий от Xwo

даже в этом случае отсылать обратно все id это излишне. Достаточно послать обратно условный флажок «получил». В респонзе зафигачиваешь request_id, и пускай клиент его шлет, а ты уже маркируешь отосланные данные как полученые. Но вообще, товарищи выше абсолютно правы на счет websocket - его как раз для таких вот вещей и придумывали

gnunixon ★★★
()
Ответ на: комментарий от gnunixon
Достаточно послать обратно условный флажок «получил». В респонзе зафигачиваешь request_id, и пускай клиент его шлет, а ты уже маркируешь отосланные данные как полученые.

Бррр, ничего не понял. Можешь детализировать?

Но вообще, товарищи выше абсолютно правы на счет websocket - его как раз для таких вот вещей и придумывали

Последний раз, когда я пытался использовать django-channels - у меня это всё восторга не вызвало

Xwo
() автор топика
Последнее исправление: Xwo (всего исправлений: 2)
Ответ на: комментарий от rach_linux

Это может значить, только то, что он их хочет забрать. Как сервер узнает, что сообщения клиент забрал?

Xwo
() автор топика
Ответ на: комментарий от Xwo

ответить с фронта "OK", не? ну или куда они там придут.

а если это какой нибудь веб чат, то зачем там вообще серверу знать, что клиент забрал сообщения?

rach_linux
()
Ответ на: комментарий от rach_linux
  1. Это не веб-чат, а мобильная аплекуха
  2. Ответить «ОК». Расскажи свою реализацию этого
Xwo
() автор топика
Ответ на: комментарий от Xwo

как клиент узнает, что для него есть новое сообщение? ему должно придти уведомление? вот например сразу после получения уведомления, можно и сказать «ОК»

rach_linux
()
Ответ на: комментарий от rach_linux

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

Xwo
() автор топика
Последнее исправление: Xwo (всего исправлений: 3)
Ответ на: комментарий от Xwo

потому как не вижу механизма, при котором сервер может узнать о том, доставлены ли данные клиенту или нет

после получения отдавать список ids всех полученных сообщений

Сам же ответил, ещё в ОП.

так и использование xmpp

Никто не заставляет использовать что-то. Просто, можно посмотреть, как это реализовано в открытых протоколах, в том числе и xmpp, XEP-0184 нам рассказывает о «квитанциях».

В телеге, тоже самое, квитанции.

vvn_black ★★★★★
()
Ответ на: комментарий от Xwo

надо смотреть как реализовано получение сообщений.

клиент подключается и спрашивает «есть новые сообщения?» > сервер отвечает есть или нет. > если сообщения есть, то клиент говорит «дай их сюда и пометь как доставлено». и не важно читал он их или нет. достаточно того, что был запрос на новые сообщения.

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

rach_linux
()
Ответ на: комментарий от rach_linux

Правильно отметили. Можно сделать на уровне транспорта:

  • если long polling, то сам факт забора сообщений с сервера - это «получено клиентом» (одна галочка)
  • если хуки, то ответ клиента 200 на апдейт - факт доставки сообщения.

А отметку о прочтении без отправки клиентом списка id уже не сделать.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

а зачем слать id обратно?

есть 3 состояния у сообщения: «новое», «доставлено», «прочитано».

в базу говоришь «дай все новые». и помечаешь их «доставленными». заходишь в чат и говоришь «пометь все доставленные как прочитанные»

rach_linux
()
Ответ на: комментарий от rach_linux

а зачем слать id обратно?

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

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

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

rach_linux
()
Ответ на: комментарий от Xwo

А если на него будет 1000-10000 http запросов сваливаться — лучше будет?
Ты же не написал ничего про характер нагрузки.
Вот сам и решай.

Goury ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.