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

IdTCPClient, IdTCPServer и соеденение


CyberStorm

Вопрос

Обычно когда я пишу вопрос свой на форуме, я сам сразу нахожу решение и топик приходится закрывать не публикуя. Но вот щас пишу, и ничего в голову не приходит всё равно.

Пишу сетевой чатик на RadStrudio 1.4, нашел на просторах пример и все работает:

Код клиента:

form1.IdTCPClient1.Connect;
form1.IdTCPClient1.Socket.WriteLn('HELLO');
form1.IdTCPClient1.Socket.ReadLn(s);

Код сервера (там где Execute):

AContext.Connection.Socket.ReadLn(s);
AContext.Connection.Socket.WriteLn('TEST');
AContext.Connection.Socket.Дисконнект;

Все так предельно просто и всё работает :)

Но я вот решил оптимизировать приложение, и подумал - а не напряжно ли серверу постоянно обрабатывать Коннекты, а затем делать Дисконнекты на каждый запрос?

Подумал, и сделал при старте клиента form1.IdTCPClient1.Connect; а у сервера убрал постоянный AContext.Connection.Socket.Дисконнект;

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

Ссылка на комментарий

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

  • 0

Тут все просто - нужно ждать. Ваш код работает корректно только в идеальных условиях. Но если вторая сторона не ответила мгновенно, то вы уже ничего не получите.

Перед отправкой/получением вам надо проверить наличие соединения функцией FTCPClient.IOHandler.CheckForDisconnect()  - при отсутствии соединения она сгенерит исключение:

  try
    FTCPClient.IOHandler.CheckForDisconnect();
  except
    on E: EIdException do
    begin
      LogError('TUTM5StreamProtocol.Run CheckForDisconnect ERROR ' + E.Message);
      Reconnect();
    end;
  end;

Читать с ожиданием данных можно несколькими способами:

1. Задавать FTCPClient.IOHandler.ReadTimeout в надежде что в отведенное время что то придет.

2. Использовать FTCPClient.IOHandler.ReadLnWait() для чтения строки.

3. Или обрабатывать проверять наличие данных и читать по мере их поступления:

      if FTCPClient.IOHandler.CheckForDataOnSource(FConnectParams.Timeouts.TCPReadTimeout) then
		читаем....

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...