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

RVMedia support and discussion (components for displaying and controlling IP cameras, webcams, video conferencing, video chats, recording audio and video files)
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Здравствуйте.

Использую компоненты RVMedia для обмена текстовыми командами между двумя программами.
Задействую компоненты RVCamSender для отправки сообщения на указанный IP, и RVCamReceiver для получения сообщения, посредством события RVCamReceiverReceiveUserData. В локальной сети проблем нет, IP обнаружить не сложно, я его передаю тем же текстовым сообщением.
Вопрос: Есть ли возможность узнать IP адрес, с которого пришло сообщение на RVCamReceiver автоматически при получении?
Вообще хотел использовать передачу сообщений через интернет, где сервер будет на одном белом IP, а вот клиенты могут быть за модемами в интернете. Достучаться до сервера они смогут, но как получить ответ от сервера я не могу понять?
Можете подсказать?
Заранее спасибо.
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

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

Post 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.
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Ага. Видел эти режимы, но до конца не понимал для чего они.

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

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

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

P.S.
Кстати, у меня купленная версия, как можно зарегистрировать ее ключ? И попутно, вопрос, если я установлю эту версию на Delphi Starter 10, я смогу потом переустановить ее на Delphi Pro, или придется еще раз покупать компонент?
Спасибо.
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

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

Post 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.
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post 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:порт

Спасибо!
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

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

Post by Sergey Tkachenko »

Завтра я выложу работающий пример, извините за задержку
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Спасибо! Наверное я слишком запутанно написал. Суть вопроса:

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

Необходимо клиенту подключиться к серверу и получить строку.
Какие настройки нужно выставить на компонентах?
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

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

Post 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, доступной для зарегистрированных пользователей. И, к сожалению, как минимум один баг остался - файл не посылается от "белой" к "серой" копии. Исправим в ближайшее время.
Attachments
whiteandgrayip.zip
(8.25 KiB) Downloaded 1881 times
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Спасибо большое!!! Буду разбираться.
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Разобрался полностью! Огромное спасибо за помощь.
Дальше уже разбирался с Медиасервером, и там уже было легче.

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

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

В любом случае спасибо большое за помощь!
MS.zip
Листинг сборной программы. Обе части работают и с одного компьютера.
(3.12 KiB) Downloaded 1844 times
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

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

Post by Sergey Tkachenko »

Во-первых, нужно включить в CmdOptions сервера rvcpUseSystemCmd и rvcpUseSystemCmdAllOnline.
Во-вторых, юзерами онлайн считаются те, кто вызвал HelloToAllowedSenders. Ее нужно вызвать перед получением списка.
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

HelloToAllowedSenders - Воот! Этого у меня небыло!
Спасибо!!!
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

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

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

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

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

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

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

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

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

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


Прошу прощения - быстро писал пример, который вложил - там Button1 - это запуск сервера/соединение от клиента(включение компонентов), а Button2 - остановка сервера/ выключение компонентов клиента.
Attachments
Server.zip
RVMedia Лицензия бета
(1.67 KiB) Downloaded 1820 times
Client.zip
RVMedia Лицензия бета
(1.52 KiB) Downloaded 1838 times
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Здравствуйте еще раз. Прошу прощения - хотел спросить, сможете ли помочь с проблемой?
Kosedr
Posts: 18
Joined: Wed Aug 16, 2017 7:19 am

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

Post by Kosedr »

Построчно перебрал пример с сервером для видеочата. И все-таки сам нашел ошибку.
Скорее всего это баг.

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

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