Page 1 of 2

Мессенджер через Интернет.

Posted: Mon Nov 27, 2017 12:45 pm
by Kosedr
Здравствуйте.

Использую компоненты RVMedia для обмена текстовыми командами между двумя программами.
Задействую компоненты RVCamSender для отправки сообщения на указанный IP, и RVCamReceiver для получения сообщения, посредством события RVCamReceiverReceiveUserData. В локальной сети проблем нет, IP обнаружить не сложно, я его передаю тем же текстовым сообщением.
Вопрос: Есть ли возможность узнать IP адрес, с которого пришло сообщение на RVCamReceiver автоматически при получении?
Вообще хотел использовать передачу сообщений через интернет, где сервер будет на одном белом IP, а вот клиенты могут быть за модемами в интернете. Достучаться до сервера они смогут, но как получить ответ от сервера я не могу понять?
Можете подсказать?
Заранее спасибо.

Re: Мессенджер через Интернет.

Posted: Mon Nov 27, 2017 12:58 pm
by Sergey Tkachenko
Это невозможно (если IP другой стороны "серый"), но и не нужно.
Есть два режима соединения TRVCamSender-TRVCamReceiver: от сендера к ресиверу, и обратный, от ресивера к сендеру.
Режимы соединения описаны в справке по TRVCamSender: http://www.trichview.com/help-media/trvcamsender.htm
В обоих случаях нужно использовать соединение от серого IP к белому.
Кажется, у нас был тестовый пример такого соединения, постараюсь отыскать.

К сожалению, насколько я помню, в режиме соединения от ресивера к сендеру в RVMedia 5.0 есть ошибки, следует использовать бета-версию (доступна для зарегистрированных пользователей RVMedia)


---

Translation

The question was about connecting two apps, when one of them does not have an open (white) IP address.
My recommendation is connecting from gray to white IP, sender-to-receiver connection mode to send from gray to white, and receiver-to-sender connection mode to send from white to gray.

Re: Мессенджер через Интернет.

Posted: Mon Nov 27, 2017 1:18 pm
by Kosedr
Ага. Видел эти режимы, но до конца не понимал для чего они.

Но все же, если не трудно поясните:

У меня Сервер с Sender и Reciever. и Клиент с Sender и Reciever. Я передавал данные от Sender к Reciever в обе стороны на соответствующие компоненты. Режим стоял rvtcpSenderToReceiver.

Но если я правильно понял вас, то На Клиенте должен быть Sender, а на сервере Reciever (белый IP). Если я сменю режим на rvtcpReceiverToSender, то клиент каким-то образом должен получить данные. Но вот как, и каким методом я и не понимаю.

P.S.
Кстати, у меня купленная версия, как можно зарегистрировать ее ключ? И попутно, вопрос, если я установлю эту версию на Delphi Starter 10, я смогу потом переустановить ее на Delphi Pro, или придется еще раз покупать компонент?
Спасибо.

Re: Мессенджер через Интернет.

Posted: Mon Nov 27, 2017 2:27 pm
by Sergey Tkachenko
Если вы используете архитектуру клиент-сервер (то есть одно специальное приложение-сервер, к которому коннектятся много клиентов), рассмотрите возможность использовать компонент TRVMediaServer. Пусть все клиенты коннектятся к нему. Тогда важно, чтобы сервер имел белый IP (чтобы клиенты могли найти его), а клиенты могут иметь серый IP.
В приложении-сервере можно тоже завести отдельный клиент, то есть добавить пару TRVCamSender и TRVCamReceiver в то же приложение. Пусть они коннектятся к TRVMediaServer по TCP, как и остальные клиенты.
---

Если же вы используете одинаковые приложения на обеих сторонах, то дело обстоит так.
Хотя бы одна сторона (назовем ее А) должна иметь белый IP. Соединение должно инициироваться другой стороной (B), у которой может не быть белого IP.
И А и B имеют TRVCamSender и TRVCamReceiver.
A.Sender отправляет сообщения в B.Receiver, B.Sender отправляет сообщения в A.Receiver. Только соединения A.Sender-B.Receiver и B.Sender-A.Receiver нужно устанавливать по-разному.
B.Sender - A.Receiver должно устанавливать соединение вида sender -> receiver.
A.Sender - B.Receiver должно устанавливать соединение вида receiver -> sender.

Тут нужно для себя понять, чтобы не путать. Данные всегда передаются от Sender к Receiver, это следует из их названия. А режимы соединения - это каким образом между ними устанавливается связь. Разные режимы как раз нужны для того, чтобы устанавливать соединения, когда одна сторона не имеет белого IP.

PS: я открыл вам доступ к закрытому форуму RVMedia.

Re: Мессенджер через Интернет.

Posted: Mon Nov 27, 2017 3:22 pm
by Kosedr
Если же вы используете одинаковые приложения на обеих сторонах, то дело обстоит так.
Хотя бы одна сторона (назовем ее А) должна иметь белый IP. Соединение должно инициироваться другой стороной (B), у которой может не быть белого IP.
И А и B имеют TRVCamSender и TRVCamReceiver.
- У меня именно такая схема, только везде sender to reciever и сеть локальная.

Теперь понятно по режимам. Остается вопрос, какие настройки необходимо выставить на компонентах.
Я делал так для обоих направлений (Delphi):
ServerCMDPort := <Порт для клиента и сервера один и тот же.>;
Передающая сторона:
RVCamSenderCom.Protocol :=rvpTCP;
RVCamSenderCom.SenderPort := ServerCMDPort;
RVCamSenderCom.ReceiverPort := ServerCMDPort;
RVCamSenderCom.GUIDTo := '{00000000-0000-9999-0000-000000000000}';
RVCamSenderCom.GUIDFrom := '{00000000-0000-0000-9999-000000000000}';
RVCamSenderCom.ReceiverHost := <IP адрес принимающей стороны (внутренний)>;

Принимающая сторона:
RVCamReceiverCom.Protocol :=rvpTCP;
RVCamReceiverCom.Senders.Add;
RVCamReceiverCom.Senders.Items[0].GUIDFrom := '{00000000-0000-0000-9999-000000000000}';
RVCamReceiverCom.GUIDMy := '{00000000-0000-9999-0000-000000000000}';
RVCamReceiverCom.Port := ServerCMDPort;

При отправке на сервер проблем никаких - IP адрес белый.
При отправке на конкретного клиента я использовал адрес этого клиента и менял следующие данные:

RVCamSenderCom.GUIDFrom := '{00000000-0000-9999-0000-000000000000}';
RVCamSenderCom.GUIDTo := <GUID клиента, к примеру '{00000000-0000-0000-9999-000000000000}'>;
RVCamSenderCom.ReceiverHost := <IP адрес принимающей стороны (внутренний)>;

И отправлял данные посредством RVCamSenderCom.SendUserData(Stream); - Как в примерах.

Вы можете мне указать, что мне нужно внести, чтобы эта же схема заработала при условии, что я не знаю <IP адрес принимающей стороны (внутренний)>.

На оба компонента я выставляю режим rvtcpReceiverToSender. Но где ввести в ресивере белый адрес IP ? Неужели в:
RVCamReceiverCom.Senders.Add;
RVCamReceiverCom.Senders.Items[0].SenderHost ?

Или

RVCamReceiverCom.Senders.Items[0].UserDataSenders ?

В общем вопрос как Ресиверу инициализировать подключение на IP:порт

Спасибо!

Re: Мессенджер через Интернет.

Posted: Tue Nov 28, 2017 7:09 pm
by Sergey Tkachenko
Завтра я выложу работающий пример, извините за задержку

Re: Мессенджер через Интернет.

Posted: Wed Nov 29, 2017 6:55 am
by Kosedr
Спасибо! Наверное я слишком запутанно написал. Суть вопроса:

Сервер стоит на белом IP и на нем Sender.
Клиент стоит на сером неизвестном IP и у него Reciever.
У обоих компонентов стоит настройка RecieverToSender

Необходимо клиенту подключиться к серверу и получить строку.
Какие настройки нужно выставить на компонентах?

Re: Мессенджер через Интернет.

Posted: Thu Nov 30, 2017 6:24 pm
by Sergey Tkachenko
Я прикладываю демку.

Запускаете одну копию на компьютере с известным IP. Выбираете "I will wait for connection" и нажимаете на кнопку "Listen".
Запускаете вторую копию на другом компьютере. Не важно, известен его IP или нет. "I will connect to remote client", вводите адрес первого компьютера в поле "Connect to - Address", нажимаете кнопку "Connect".

Соединение будет установлено.
Причем одно будет двустороннее: обе копии смогут посылать друг другу видео, звук, команды и файлы.

К сожалению, насколько я помню, в RVMedia 5.0 есть баги в режиме receiver-to-sender, потому демка, скорее всего, будет работать только в новой бета-версии RVMedia, доступной для зарегистрированных пользователей. И, к сожалению, как минимум один баг остался - файл не посылается от "белой" к "серой" копии. Исправим в ближайшее время.

Re: Мессенджер через Интернет.

Posted: Fri Dec 01, 2017 8:45 am
by Kosedr
Спасибо большое!!! Буду разбираться.

Re: Мессенджер через Интернет.

Posted: Tue Dec 05, 2017 11:12 am
by Kosedr
Разобрался полностью! Огромное спасибо за помощь.
Дальше уже разбирался с Медиасервером, и там уже было легче.

Однако по прежнему есть непонятность:

Я никак не могу заставить срабатывать RVCamReceiver1GetAllOnlineUsers в ответ на команду RVCamSender1.GetAllOnlineUsers;
При этом RVCamReceiver1GetAllUsers в ответ на команду RVCamSender1.GetAllUsers; срабатывает без проблем.
В свойствах стоит rvkclmAlways. (При этом сервер показывает, что команда к нему пришла (срабатывает RVMediaServer1ServerCmd)).

В любом случае спасибо большое за помощь!
MS.zip
Листинг сборной программы. Обе части работают и с одного компьютера.
(3.12 KiB) Downloaded 241 times

Re: Мессенджер через Интернет.

Posted: Tue Dec 12, 2017 12:28 pm
by Sergey Tkachenko
Во-первых, нужно включить в CmdOptions сервера rvcpUseSystemCmd и rvcpUseSystemCmdAllOnline.
Во-вторых, юзерами онлайн считаются те, кто вызвал HelloToAllowedSenders. Ее нужно вызвать перед получением списка.

Re: Мессенджер через Интернет.

Posted: Fri Dec 15, 2017 7:47 am
by Kosedr
HelloToAllowedSenders - Воот! Этого у меня небыло!
Спасибо!!!

Re: Мессенджер через Интернет.

Posted: Fri Dec 15, 2017 1:23 pm
by Kosedr
К сожалению все-таки возникла проблема, которую я не могу решить.
Я очень прошу мне помочь.

Я выделил именно проблемный участок кода.
Суть в следующем:

Есть серверная программа, которая состоит из Медиасервера и Пары Sender+Reciever.
Эта пара подключается к медиасерверу и работает с ним.
Порты у них одинаковые (Кстати, может в этом проблема).

Есть клиентские программы, которые состоят из пар Sender+Reciever и коннектятся они к медиасерверу, после чего взаимодействуют с Серверной парой Sender+Reciever.

Запускаем сервер и видим, что его пара к нему нормально присоединилась.
Запускаем клиент и он тоже нормально взаимодействует с программой сервером.

В чем проблема:
Если в этот момент отключить клиента и подключить его заново, или попытаться остановить медиасервер на серверной программе, то Сервер зависает намертво или показывает, что клиент подключен, но информацию с него не принимает.
Основная проблема именно в том, что медиасервер не хочет отключаться корректно.
При этом, если к нему подключен только один клиент, то он отключается корректно, но если их больше одного, то виснет.

Пытался это сделать на демо версии, потом поставил лицензию Бета.

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

Возможно, медиасервер как-то должен обработать отключение пользователей перед его остановкой, возможно я что-то упустил.


Прошу прощения - быстро писал пример, который вложил - там Button1 - это запуск сервера/соединение от клиента(включение компонентов), а Button2 - остановка сервера/ выключение компонентов клиента.

Re: Мессенджер через Интернет.

Posted: Mon Dec 25, 2017 7:20 am
by Kosedr
Здравствуйте еще раз. Прошу прощения - хотел спросить, сможете ли помочь с проблемой?

Re: Мессенджер через Интернет.

Posted: Mon Dec 25, 2017 9:27 am
by Kosedr
Построчно перебрал пример с сервером для видеочата. И все-таки сам нашел ошибку.
Скорее всего это баг.

Если при выключении программы стоит режим:
RVMediaServer1.KeepClientInfoMode := rvkclmAlways;
- то сервер работает и выключается нормально.
Если стоит режим RVMediaServer1.KeepClientInfoMode := rvkclmWhileOnline;
- то сервер зависает если его выключить при подключенных клиентах.

Даже можно обмануть компонент и перед выключением сделать:
RVMediaServer1.KeepClientInfoMode := rvkclmAlways;, а потом уже:
RVMediaServer1.HTTPActive := false;
И сервер тоже отключается корректно.