Сообщение от севера клиенту.

Basketbol
Дата: 09.08.2019 23:12:48
Доброго дня всем!
Вопрос: в сетевом программировании можно ли послать инфу от сервера клиенту, без запроса клиента?
Использую библиотеку RTC.
Там везде в примерах указаны схемы с функциями на сервере, которые вызываются клиентом.
Т.е. клиент шлет какой то запрос - сервер отвечает.

У меня будет приложение где возможно будет множество клиентов, каждый из которых будет слать некий запрос серверу раз в секунду.
Но далеко не всегда будет возвращаться ответ. И возможно что зачастую ответ будет равен предыдущему ответу.
Для оптимизации процесса я задумался над сабжем.
Т.е. у сервера есть инфа о том, какие данные нужны клиенту. И он может их посылать только тогда, когда они изменились. Т.е. не обязательно ждать запроса от клиента.
Но как послать, когда от клиента нет запроса?
X-Cite
Дата: 09.08.2019 23:53:31
2 варианта
1) Держать соединение между сервером и клиентами постоянно открытым. Тогда сервер знает обо всех подключенных клиентах и может им слать что угодно, когда угодно.
2) Клиенты регистрируют на сервере свои IP и порты по которым они будут работать как серверы. И сервер по факту превращается в клиента, который подключается по зарегистрированным IP и портам и отправляет им что угодно.
X-Cite
Дата: 09.08.2019 23:57:29
Есть 3 вариант... более гибкий..
1) Разворачиваем брокер (кафка/раббит/самописное нечто)
2) регистрируем там столько тем/каналов сколько будет сообщений (событий) от сервера
3) Клиенты подписываются у брокера на темы
4) Сервер по событиям шлет в брокер в соответствующие темы инфу.

Гибкость в том, что ни сервер ни клиент не знают друг о друге. При этом сервер можно горизонтально масштабировать.
YuRock
Дата: 10.08.2019 00:09:13
Basketbol
как послать, когда от клиента нет запроса?
Ровно точно так же, как в случае, если от клиента есть запрос. С помощью send.
Basketbol
Дата: 10.08.2019 07:59:52
Спасибо за ответы.

YuRock
Ровно точно так же, как в случае, если от клиента есть запрос. С помощью send.


В контексте использования библиотеки RTC - (насколько я понял философию автора) - мы можем только отвечать в контексте запроса от клиента. Во многих ответах на вопросы на своем форуме автор библиотеки регулярно просит воздерживаться от хранения соединений где то в глобальных переменных. Косвенно на такую философию указывает тот факт что там есть server.connectionCount, но нет sever.connections, и мы можем посылать инфу только в контексте запроса от клиента:
procedure TDataServer.RtcFunctionExecute(Sender: TRtcConnection;
  Param: TRtcFunctionInfo; Result: TRtcValue);
begin
  result.asString := 'myAnswer';
end;
YuRock
Дата: 10.08.2019 12:21:54
Basketbol
В контексте использования библиотеки RTC - (насколько я понял философию автора) - мы можем только отвечать в контексте запроса от клиента.
Я не в курсе, что это за библиотека, и какие причины заставляют её использовать.
Я такими библиотеками не пользуюсь и написал в общем случае.

А вопрос в теме вообще странно звучал.
Довольно штатная ситуация, когда клиент коннестится [, проходит аутентификацию,] и начинает бесконечно получать эхо от сервера (состояние какое-то) без каких либо запросов.
vkorshun
Дата: 12.08.2019 14:16:20
Ответ на похожий вопрос от автора RTC - [url=]https://rtc.teppi.net/sdkarchive/index42454245.html?cmd=viewtopic&topic_id=207§ion_id=9&sid=[/url]

Ну и еще наверно можно использовать websocket соединение. RTC так же поддерживает.
Dimitry Sibiryakov
Дата: 12.08.2019 15:05:38

Или выкинуть напрочь это RTC и использовать BSD Sockets с которыми всё просто и понятно.

Posted via ActualForum NNTP Server 1.5