Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 18.06.2016
Сообщений: 4
1
RAD XE3+

WeBSockets Клиент - Сервер Делфи не соединяется по Интернету

30.04.2019, 11:43. Показов 2986. Ответов 7

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите с проблемой. Пытаюсь разобраться с библиотекой WEBSockets, TidWEBHTTPClient и TidWEBServer, использую эти компоненты для обмена данными. Программа умеет соединять ся по сети и отправлять текстовую информацию и картинки. Но когда пытаюсь подключиться к серверу через интернет. выдает ошибку Connect time out.

Клиент подключается так (сделал 2 варианта по примерам которые нашел) не работает ни один.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TForm1.Button2Click(Sender: TObject);
var strm:tmemorystream;
    s:string;
begin
  if not assigned(client) then
   begin
    client := TIdHTTPWebsocketClient.Create(Self);
    client.Port := 8585;
    client.OnBinData     := ClientBinDataReceived;
   end;
    client.Host := IpEdit.Text;
  case RG1.ItemIndex of
   0:begin
      if not client.CheckConnection then
       begin
        client.Connect;
        client.UpgradeToWebsocket;
        client.IOHandler.Write('Connection is Active');
       end;
     end;
 
   1:begin
      client.SocketIOCompatible := False;
      //client.UpgradeToWebsocket;
      strm := TMemoryStream.Create;
      try
       client.Get('http://'+client.Host+':8585/index.html', strm);
       with TStreamReader.Create(strm) do
        begin
         strm.Position := 0;
         s := ReadToEnd;
         Free;
        end;
 
       showmessage(s);
      finally
       strm.Free;
      end;
     end;
  end;
 
   StatusT.Tag:=0;
end;
сервер:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.SerButtonClick(Sender: TObject);
begin
 if not assigned(server) then
  begin
   server := TIdWebsocketServer.Create(Self);
   server.DefaultPort := 8585;
   server.OnMessageText := ServerMessageTextReceived;
   server.OnMessageBin:=ServerdataMessage;
   server.OnCommandGet:=HandleHTTPServerCommandGet;
   server.KeepAlive:=true;
  end;
  server.Active      := not server.Active;
  if server.Active then
   logserver.Lines.Add(datetimetostr(date)+' : Server is STARTED')
  else
   logserver.Lines.Add(datetimetostr(date)+' : Server is STOPPED')
end;
В общем не подключается никак. порты в роутере пробросил. ip посмотрел на myip.ru.

Инфы по теме очень не много, приходится методом тыка все проверять, нашел пару примеров использования, но они все по сети. Помогите модифицировать код или скиньте рабочий пример пожалуйста. Очень нужно!!! Времени в обрез.
Миниатюры
WeBSockets Клиент - Сервер Делфи не соединяется по Интернету  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2019, 11:43
Ответы с готовыми решениями:

Передача данных, клиент-сервер по интернету
Здравствуйте, простой чат на основе Winsock, не работает через интернет, т.е. данные только от...

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

Компонент для связи клиент/сервер по интернету
Здарствуйте. Работал с компанентами Server и Client Socket в локальной сети и они меня устраивали,...

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

7
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
01.05.2019, 16:09 2
Причин может быть тьма тьмущая. Проверку надо делать не пробрасывая порты на роутере (который, кстати, несмотря на то, что вам показывает myip, вполне может и скорее всего имеет серый айпишник, которому никакие пробросы порта не помогут), а на своем ПК, подключаясь к localhost или 127.0.0.1. Это позволит практически полностью исключит проблемы, связанные с транспортным протоколом и даст "чистый" результат.

А почему выбор пал на TidWebHTTP? Есть ведь TidHTTP и TidHTTPServer, с которыми работают значительно чаще.
0
0 / 0 / 0
Регистрация: 18.06.2016
Сообщений: 4
04.05.2019, 14:07  [ТС] 3
Я понимаю про серый IP. Возможно и такое, у меня есть комп с белый постоянным IP. Там результат такой же.
Почему выбор пал на Web, потому что по сути это тоже самое что и обычный httpclient, просто эти компоненты работают асинхронно. т.е. обработка сообщений упрощается. У меня просто совсем нет опыта в разработке клиент серверных приложений. Я много чего не знаю по этой теме. Для меня не принципиально какой компонент использовать, главное чтоб работало. Часть программы работающей по сети дописываю уже. Здесь проще все, а вот последний этап передачи данных через web совсем никак не идет. мне бы любой рабочий код примера, как это реализуется с точки зрения именно клиент-серверного приложения. просто все примеры в сети в основном тупо клиентятся к какому-нибудь сайту. Этот вариант мне не подходит...
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
05.05.2019, 07:58 4
Цитата Сообщение от Lexxrus Посмотреть сообщение
Почему выбор пал на Web, потому что по сути это тоже самое что и обычный httpclient, просто эти компоненты работают асинхронно
Асинхронность, имхо, спорный плюс, если речь не идет о каких-то значимых нагрузках.

Лично я последний раз для своих целей использовал связку idHTTPServer + NetHTTPClient.

Со стороны клиента выглядит вот так:

Delphi
1
result := self.Get('тут_ваш_адрес').ContentAsString.Trim;
После выполнения результат запроса будет в result.

Со стороны сервера:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
TMyServer = class(TIdHTTPServer)
  PRIVATE
  ...
    procedure ServerCommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
  ...
  protected
  public
    ...
 
constructor TMyServer.Create;
begin
  inherited Create(nil);
...
  SELF.OnCommandGet := self.ServerCommandGet;
...
end;
 
procedure TMyServer.ServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var LCommand:String; //команда
    LModule:string;  //модуль
//    LContext:DMContext ABSOLUTE AContext;
    LModuleController:DMCustomModule;
    i: Integer;
begin
try
 
if ARequestInfo.Command.ToUpper = 'GET' then
begin
  if Pos('?',AREQUESTINFO.URI) > 0 then
    begin
    //получаем параметры запроса
    end;
end
else if AREQUESTINFO.Command.ToUpper = 'POST' then
  begin
  //обрабатываем POST-запросы 
  end;
end;
Если вам надо посылать только текстовую информацию, то, возможно, вам имеет смысл посмотреть в сторону TServerSocket и TClientSocket. Компоненты, конечно, старые, но для простой отправки вполне себе могут подойти.
1
0 / 0 / 0
Регистрация: 18.06.2016
Сообщений: 4
05.05.2019, 17:02  [ТС] 5
Спасибо за код! TIdWebsocketServer создан на основе TidHTTPServer. Так что разницы нет особо, какой компонент использовать. Вопрос как использовать) Вы создаете сервер не указывая порт прослушки, так должно быть?
Или какие-то установки не попали в пример? Можно весь код создания сервера? или рабочий пример. Сервак на чем висел? Коннект проверяли по вебу или только сеть? У меня проблема в отсутствии шаблона правильной инициализации сервера и создания условий для его работы... Т.е. Есть условия, белый ip, проброс портов в роутере, комп с работающим сервером. Как с такой конфигурацией инициализировать правильно сервер? Данные будут передаваться как текст, так и графика, и требуется постоянный коннект и частая передача данных, потому и выбрал асинхронный компонент.
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
05.05.2019, 18:56 6
Цитата Сообщение от Lexxrus Посмотреть сообщение
Вы создаете сервер не указывая порт прослушки, так должно быть?
Нет. Заполняйте свойство DefaultPort или покопайтесь в Bindings.
Цитата Сообщение от Lexxrus Посмотреть сообщение
Можно весь код создания сервера?
Нет. Основное я привел, остальное смысла выкладывать нет. То же с рабочим примером: приведенного уже достаточно, чтобы пример был рабочим.
Цитата Сообщение от Lexxrus Посмотреть сообщение
Сервак на чем висел? Коннект проверяли по вебу или только сеть?
Ваша терминология меня несколько ставит в тупик. Что значит "на чем висел"? Веб - это вы имеете ввиду глобальную сеть? На самом деле, мне не принципиально, я уже далеко не первый проект делаю, и просто на TCP/IP, и по HTTP, которые работают как в локальной сети, так и в глобальной (по сути, в плане программирования разницы быть не должно).
Цитата Сообщение от Lexxrus Посмотреть сообщение
У меня проблема в отсутствии шаблона правильной инициализации сервера и создания условий для его работы
Дак сам по себе компонент - это и есть шаблон. Навесьте на него событие, которое будет обрабатывать GET-запросы, задайте начальные параметры - и понеслась. Пример я вам привел.
Цитата Сообщение от Lexxrus Посмотреть сообщение
Как с такой конфигурацией инициализировать правильно сервер?
Я вам уже писал - сначала отладьте ваш сервер на локальной машине, убедитесь, что у вас все работает, а потом уже лезьте в глобальную сеть. Иначе в потоке ошибок пробросов портов, ошибочных белых айпишников, блокирующих файрволлов и еще кучи всякой дребедени вы замучаетесь ловить причину вашего "неконнекта".
Цитата Сообщение от Lexxrus Посмотреть сообщение
требуется постоянный коннект
Это не HTTP. Постоянный коннект - это TCP/IP, например.
0
0 / 0 / 0
Регистрация: 18.06.2016
Сообщений: 4
07.05.2019, 11:27  [ТС] 7
Спасибо за ответ. Но суть проблемы так и не изменилась. Я знаю как настроить сам компонент для работы, а также перехватывать и обрабатывать запросы на сервере и на локалке все работает. Проблема в том что, то что работает на локалке пусть даже взять Ваш пример, не хочет работать через интернет. Условия которые у меня есть я Вам уже описал. Суть вопроса в том что возможно я не знаю всех тонкостей настройки сервера для работы по следующей схеме (Комп->роутер->WWW<-роутер<-Клиент). Потому и просил работающий в таком режиме пример чтобы разобрать его код и понять где я допускаю ошибку. Но раз Вы считаете что мне такой пример ни к чему, постараюсь разобраться сам. В любом случае, спасибо, за то что уделили время моей проблеме!
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
07.05.2019, 12:50 8
Цитата Сообщение от Lexxrus Посмотреть сообщение
Суть вопроса в том что возможно я не знаю всех тонкостей настройки сервера для работы по следующей схеме (Комп->роутер->WWW<-роутер<-Клиент). Потому и просил работающий в таком режиме пример чтобы разобрать его код и понять где я допускаю ошибку
Поймите простую вещь. Для компьютера, который является у вас сервером (даже если это тот же комп, где вы запускаете программу) нет никакой разницы, как и откуда до него "достучится" клиент. Если у вас все работает в локальной сети, и не работает в глобальной, то наиболее вероятная причина не в вашей программе, а в сетевых настройках. Может быть, блокирует файрволл. Может быть, вы неправильно сделали проброс портов. Может быть, то, что вы считаете белым айпишником, на самом деле таковым не является. Или является, но не на вашем роутере.

Особенно, если вы не лезли в bindings и не привязывали там '127.0.0.1' или 'localhost', то программных причин для проблем я не вижу. Более того, у меня в коде, который я вам не привел, вообще нет ни одной строки, которая бы могла повлиять как-то на работу в глобальной сети, и при этом не влиять на работу в локальной. Оно либо работает везде, либо не работает нигде.

Главное, что вам надо запомнить: если работает локально, то будет работать и глобально. Если не работает глобально - надо искать причину в сетевых настройках.

P.S. Ну и, главное правило: слушайте умных людей, но не забывайте, что и умные люди иногда ошибаются. Я могу заявлять многие вещи супербезаппеляционно, потому что они работают у меня и мой опыт позволяет мне считать именно так, как я говорю, но при этом по факту ошибаться и вводить вас в заблуждение без злого умысла.
1
07.05.2019, 12:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2019, 12:50
Помогаю со студенческими работами здесь

Клиент-сервер: как создать игру по интернету с сервером?
Добрый вечер. Моя цель - реализовать клиент-серверную игру программу, использующую сокеты для...

Клиент-сервер в Делфи 7
Помогите найти исходник на делфи 7 чтобы выполнялась задача &quot;Клиент-серверная взаимодействие...

ПРограма клиент сервер на Делфи
есть клиент серверная програма... с одной програмы отравляетса сообщение другая принимает... уже...

Клиент-сервер по интернету. Какой IP указать для сервера, если ПК - в общежитии с 1 роутером
Здравствуйте не знаю тут ли задавать этот вопрос. У меня в общежитии на всех компах один IP и в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru