Перейти к содержанию
Fire Monkey от А до Я
  • 0

[TIdTCPClient] Почему TIdTCPClient зависает при общении с по IP в глобальной сети?


loony-pants

Вопрос

Впервые взялся за разработку Клиент-серверного приложения.  Нашёл пример с IdTCPServer и IdTCPClient, попытался начать с реализации  запроса-ответа. При нажатии на кнопку клиент зависает (Как я понял - соединение не происходит). Ip адрес указывал просмотрев с сайта 2ip.ru и тот, что в "сведениях о сетевом подключении" - результат один и тот же - Зависает клиент. Пробовал с IdUDPClient и IdUDPServer - работает, НО только во внутренней сети, а мне необходим глобальный обмен.

 

Клиент:

procedure TForm2.LoginButtonClick(Sender: TObject);
begin
try
  IdTCPClient1.Host :='127.0.0.1'; /// Менял IP адрес 
  IdTCPClient1.Port:=55560;
  IdTCPClient1.Connect;
         except
        Memo2.Lines.Add('Не удается соединиться с указанным сервером');
        Exit;
        end;
  Memo2.Lines.Append(IdTCPClient1.Socket.ReadLn);
  IdTCPClient1.Disconnect;
end;

Сервер:

procedure TForm1.FormCreate(Sender: TObject);
begin
  section1 := TCriticalSection.Create;
  idTcpServer1.DefaultPort:=55560;
  idTcpServer1.Active:=true; 
end;


procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  strText: String;
begin
  strText := AContext.Connection.Socket.ReadLn;
  AContext.Connection.Socket.WriteLn('Login: ' + strText);
   section1.Enter;
    Edit3.Text := AContext.Connection.Socket.Binding.PeerIP;
  section1.Leave;
  Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP);
  AContext.Connection.Disconnect;
end;
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Это зависит не от индейцев и не от FireMonkey, а является общей проблемой сетевого обмена

 

Ваш сервер спрятан за NAT, т.е. нет прямого соответствия между внешним IP и локальным. Поэтому клиент и не может достучаться до него "извне".

Возможные варианты решения:

  1. сделать серверу белый IP (есть такая услуга у провайдеров, в т.ч. и мобильных)
  2. Сделать промежуточный сервер, который будет сидеть на белом IP, а исходный сервер и клиент будут подключаться к этому, таким образом они оба будут клиентами.
  3. Если доступен роутер, через который сервер "смотрит" в интернет - можно пробросить на этом роутере порт извне напрямую на локальный ip сервера.

Да, в качестве примеров работы "за NAT" вы можете привести Skype, TeamViewer, Ammyy и т.п. Но они все используют метод 2.

Еще есть вариант (кажется, не помню точно, давно этим не занимался) - DynDNS.

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...