Мессенджер через Интернет.
Мессенджер через Интернет.
Здравствуйте.
Использую компоненты RVMedia для обмена текстовыми командами между двумя программами.
Задействую компоненты RVCamSender для отправки сообщения на указанный IP, и RVCamReceiver для получения сообщения, посредством события RVCamReceiverReceiveUserData. В локальной сети проблем нет, IP обнаружить не сложно, я его передаю тем же текстовым сообщением.
Вопрос: Есть ли возможность узнать IP адрес, с которого пришло сообщение на RVCamReceiver автоматически при получении?
Вообще хотел использовать передачу сообщений через интернет, где сервер будет на одном белом IP, а вот клиенты могут быть за модемами в интернете. Достучаться до сервера они смогут, но как получить ответ от сервера я не могу понять?
Можете подсказать?
Заранее спасибо.
Использую компоненты RVMedia для обмена текстовыми командами между двумя программами.
Задействую компоненты RVCamSender для отправки сообщения на указанный IP, и RVCamReceiver для получения сообщения, посредством события RVCamReceiverReceiveUserData. В локальной сети проблем нет, IP обнаружить не сложно, я его передаю тем же текстовым сообщением.
Вопрос: Есть ли возможность узнать IP адрес, с которого пришло сообщение на RVCamReceiver автоматически при получении?
Вообще хотел использовать передачу сообщений через интернет, где сервер будет на одном белом IP, а вот клиенты могут быть за модемами в интернете. Достучаться до сервера они смогут, но как получить ответ от сервера я не могу понять?
Можете подсказать?
Заранее спасибо.
-
- Site Admin
- Posts: 17559
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
Re: Мессенджер через Интернет.
Это невозможно (если 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.
Есть два режима соединения 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: Мессенджер через Интернет.
Ага. Видел эти режимы, но до конца не понимал для чего они.
Но все же, если не трудно поясните:
У меня Сервер с Sender и Reciever. и Клиент с Sender и Reciever. Я передавал данные от Sender к Reciever в обе стороны на соответствующие компоненты. Режим стоял rvtcpSenderToReceiver.
Но если я правильно понял вас, то На Клиенте должен быть Sender, а на сервере Reciever (белый IP). Если я сменю режим на rvtcpReceiverToSender, то клиент каким-то образом должен получить данные. Но вот как, и каким методом я и не понимаю.
P.S.
Кстати, у меня купленная версия, как можно зарегистрировать ее ключ? И попутно, вопрос, если я установлю эту версию на Delphi Starter 10, я смогу потом переустановить ее на Delphi Pro, или придется еще раз покупать компонент?
Спасибо.
Но все же, если не трудно поясните:
У меня Сервер с Sender и Reciever. и Клиент с Sender и Reciever. Я передавал данные от Sender к Reciever в обе стороны на соответствующие компоненты. Режим стоял rvtcpSenderToReceiver.
Но если я правильно понял вас, то На Клиенте должен быть Sender, а на сервере Reciever (белый IP). Если я сменю режим на rvtcpReceiverToSender, то клиент каким-то образом должен получить данные. Но вот как, и каким методом я и не понимаю.
P.S.
Кстати, у меня купленная версия, как можно зарегистрировать ее ключ? И попутно, вопрос, если я установлю эту версию на Delphi Starter 10, я смогу потом переустановить ее на Delphi Pro, или придется еще раз покупать компонент?
Спасибо.
-
- Site Admin
- Posts: 17559
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
Re: Мессенджер через Интернет.
Если вы используете архитектуру клиент-сервер (то есть одно специальное приложение-сервер, к которому коннектятся много клиентов), рассмотрите возможность использовать компонент 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.
В приложении-сервере можно тоже завести отдельный клиент, то есть добавить пару 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: Мессенджер через Интернет.
- У меня именно такая схема, только везде sender to reciever и сеть локальная.Если же вы используете одинаковые приложения на обеих сторонах, то дело обстоит так.
Хотя бы одна сторона (назовем ее А) должна иметь белый IP. Соединение должно инициироваться другой стороной (B), у которой может не быть белого IP.
И А и B имеют TRVCamSender и TRVCamReceiver.
Теперь понятно по режимам. Остается вопрос, какие настройки необходимо выставить на компонентах.
Я делал так для обоих направлений (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:порт
Спасибо!
-
- Site Admin
- Posts: 17559
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
Re: Мессенджер через Интернет.
Завтра я выложу работающий пример, извините за задержку
Re: Мессенджер через Интернет.
Спасибо! Наверное я слишком запутанно написал. Суть вопроса:
Сервер стоит на белом IP и на нем Sender.
Клиент стоит на сером неизвестном IP и у него Reciever.
У обоих компонентов стоит настройка RecieverToSender
Необходимо клиенту подключиться к серверу и получить строку.
Какие настройки нужно выставить на компонентах?
Сервер стоит на белом IP и на нем Sender.
Клиент стоит на сером неизвестном IP и у него Reciever.
У обоих компонентов стоит настройка RecieverToSender
Необходимо клиенту подключиться к серверу и получить строку.
Какие настройки нужно выставить на компонентах?
-
- Site Admin
- Posts: 17559
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
Re: Мессенджер через Интернет.
Я прикладываю демку.
Запускаете одну копию на компьютере с известным 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, доступной для зарегистрированных пользователей. И, к сожалению, как минимум один баг остался - файл не посылается от "белой" к "серой" копии. Исправим в ближайшее время.
Запускаете одну копию на компьютере с известным 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 1892 times
Re: Мессенджер через Интернет.
Спасибо большое!!! Буду разбираться.
Re: Мессенджер через Интернет.
Разобрался полностью! Огромное спасибо за помощь.
Дальше уже разбирался с Медиасервером, и там уже было легче.
Однако по прежнему есть непонятность:
Я никак не могу заставить срабатывать RVCamReceiver1GetAllOnlineUsers в ответ на команду RVCamSender1.GetAllOnlineUsers;
При этом RVCamReceiver1GetAllUsers в ответ на команду RVCamSender1.GetAllUsers; срабатывает без проблем.
В свойствах стоит rvkclmAlways. (При этом сервер показывает, что команда к нему пришла (срабатывает RVMediaServer1ServerCmd)).
В любом случае спасибо большое за помощь!
Дальше уже разбирался с Медиасервером, и там уже было легче.
Однако по прежнему есть непонятность:
Я никак не могу заставить срабатывать RVCamReceiver1GetAllOnlineUsers в ответ на команду RVCamSender1.GetAllOnlineUsers;
При этом RVCamReceiver1GetAllUsers в ответ на команду RVCamSender1.GetAllUsers; срабатывает без проблем.
В свойствах стоит rvkclmAlways. (При этом сервер показывает, что команда к нему пришла (срабатывает RVMediaServer1ServerCmd)).
В любом случае спасибо большое за помощь!
-
- Site Admin
- Posts: 17559
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
Re: Мессенджер через Интернет.
Во-первых, нужно включить в CmdOptions сервера rvcpUseSystemCmd и rvcpUseSystemCmdAllOnline.
Во-вторых, юзерами онлайн считаются те, кто вызвал HelloToAllowedSenders. Ее нужно вызвать перед получением списка.
Во-вторых, юзерами онлайн считаются те, кто вызвал HelloToAllowedSenders. Ее нужно вызвать перед получением списка.
Re: Мессенджер через Интернет.
HelloToAllowedSenders - Воот! Этого у меня небыло!
Спасибо!!!
Спасибо!!!
Re: Мессенджер через Интернет.
К сожалению все-таки возникла проблема, которую я не могу решить.
Я очень прошу мне помочь.
Я выделил именно проблемный участок кода.
Суть в следующем:
Есть серверная программа, которая состоит из Медиасервера и Пары Sender+Reciever.
Эта пара подключается к медиасерверу и работает с ним.
Порты у них одинаковые (Кстати, может в этом проблема).
Есть клиентские программы, которые состоят из пар Sender+Reciever и коннектятся они к медиасерверу, после чего взаимодействуют с Серверной парой Sender+Reciever.
Запускаем сервер и видим, что его пара к нему нормально присоединилась.
Запускаем клиент и он тоже нормально взаимодействует с программой сервером.
В чем проблема:
Если в этот момент отключить клиента и подключить его заново, или попытаться остановить медиасервер на серверной программе, то Сервер зависает намертво или показывает, что клиент подключен, но информацию с него не принимает.
Основная проблема именно в том, что медиасервер не хочет отключаться корректно.
При этом, если к нему подключен только один клиент, то он отключается корректно, но если их больше одного, то виснет.
Пытался это сделать на демо версии, потом поставил лицензию Бета.
Пожалуйста помогите - что я делаю не правильно? В примере видеочата сервер просто отключается без всяких проблем, все остальное практически идентично, да и пример простой (Во вложении изолированные обе части программы, которые можно откомпилировать и попробовать запустить на двух компьютерах).
Возможно, медиасервер как-то должен обработать отключение пользователей перед его остановкой, возможно я что-то упустил.
Прошу прощения - быстро писал пример, который вложил - там Button1 - это запуск сервера/соединение от клиента(включение компонентов), а Button2 - остановка сервера/ выключение компонентов клиента.
Я очень прошу мне помочь.
Я выделил именно проблемный участок кода.
Суть в следующем:
Есть серверная программа, которая состоит из Медиасервера и Пары Sender+Reciever.
Эта пара подключается к медиасерверу и работает с ним.
Порты у них одинаковые (Кстати, может в этом проблема).
Есть клиентские программы, которые состоят из пар Sender+Reciever и коннектятся они к медиасерверу, после чего взаимодействуют с Серверной парой Sender+Reciever.
Запускаем сервер и видим, что его пара к нему нормально присоединилась.
Запускаем клиент и он тоже нормально взаимодействует с программой сервером.
В чем проблема:
Если в этот момент отключить клиента и подключить его заново, или попытаться остановить медиасервер на серверной программе, то Сервер зависает намертво или показывает, что клиент подключен, но информацию с него не принимает.
Основная проблема именно в том, что медиасервер не хочет отключаться корректно.
При этом, если к нему подключен только один клиент, то он отключается корректно, но если их больше одного, то виснет.
Пытался это сделать на демо версии, потом поставил лицензию Бета.
Пожалуйста помогите - что я делаю не правильно? В примере видеочата сервер просто отключается без всяких проблем, все остальное практически идентично, да и пример простой (Во вложении изолированные обе части программы, которые можно откомпилировать и попробовать запустить на двух компьютерах).
Возможно, медиасервер как-то должен обработать отключение пользователей перед его остановкой, возможно я что-то упустил.
Прошу прощения - быстро писал пример, который вложил - там Button1 - это запуск сервера/соединение от клиента(включение компонентов), а Button2 - остановка сервера/ выключение компонентов клиента.
- Attachments
-
- Server.zip
- RVMedia Лицензия бета
- (1.67 KiB) Downloaded 1835 times
-
- Client.zip
- RVMedia Лицензия бета
- (1.52 KiB) Downloaded 1845 times
Re: Мессенджер через Интернет.
Здравствуйте еще раз. Прошу прощения - хотел спросить, сможете ли помочь с проблемой?
Re: Мессенджер через Интернет.
Построчно перебрал пример с сервером для видеочата. И все-таки сам нашел ошибку.
Скорее всего это баг.
Если при выключении программы стоит режим:
RVMediaServer1.KeepClientInfoMode := rvkclmAlways;
- то сервер работает и выключается нормально.
Если стоит режим RVMediaServer1.KeepClientInfoMode := rvkclmWhileOnline;
- то сервер зависает если его выключить при подключенных клиентах.
Даже можно обмануть компонент и перед выключением сделать:
RVMediaServer1.KeepClientInfoMode := rvkclmAlways;, а потом уже:
RVMediaServer1.HTTPActive := false;
И сервер тоже отключается корректно.
Скорее всего это баг.
Если при выключении программы стоит режим:
RVMediaServer1.KeepClientInfoMode := rvkclmAlways;
- то сервер работает и выключается нормально.
Если стоит режим RVMediaServer1.KeepClientInfoMode := rvkclmWhileOnline;
- то сервер зависает если его выключить при подключенных клиентах.
Даже можно обмануть компонент и перед выключением сделать:
RVMediaServer1.KeepClientInfoMode := rvkclmAlways;, а потом уже:
RVMediaServer1.HTTPActive := false;
И сервер тоже отключается корректно.