Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.11.2010, 04:00
ravehog ravehog вне форума
Прохожий
 
Регистрация: 25.11.2010
Адрес: Санкт-Петербург
Сообщения: 7
Репутация: 10
Вопрос Indy TCP, активный двусторонний обмен короткими текстовыми пакетами. Как?

Доброго времени суток всем.

Излазил десятки русско- и англоязычных форумов в поисках ответа, так и не нашел ничего стоящего. Вопрос следующий: как, имея на руках компоненты Indy, построить активный двусторонний обмен данными (длина строк в среднем: 5-500 байт)? Т.е. обе стороны в любой момент могут выступить в роли передающей стороны. Использую Delphi 7 и Indy 9, но проект еще не зашел настолько далеко, чтобы сложно было перелопатить на другие версии при необходимости.

В данный момент работаю с IdTCPServer и IdTCPClient, установленными на сервер и клиент соответственно. Протокол самопальный, текстовый; во время работы клиента, в зависимости от нажатых пользователем клавиш, происходит отправка данных серверу; задача сервера же - отправлять данные клиенту по таймеру, а не в качестве "ответа" на присланные пакеты. Естественно, клиентов несколько, и данные им отправляются совершенно разные. Таймер сам по себе выставлен на 15 мс, но строка данных для отправки клиенту формируется в зависимости от происходящего на сервере, т.е. не каждый тик.

Соответственно, попытки устроить это через CommandHandler, каждые 15-25 мс спрашивая сервер, "не случилось ли что нового?", приводят к жуткому падению производительности из-за постоянных ответов типа "ничего". Нужно, чтобы сервер сам выступал в роли отправителя данных без запроса клиента на это, когда пакет данных для клиента будет подготовлен.

Пытался решить с помощью события OnExecute, так оно работает только тогда, когда клиент что-то присылает. Пытался воспользоваться IdThreadManager'ом, но не научился "вытаскивать" нужные потоки из списка. Ставить и на клиент, и на сервер по паре компонентов TCPClient/TCPServer - плохая идея, т.к. сервер имеет открытый постоянный IP-адрес, а вот клиент может запросто подключаться из какой-нибудь сети через шлюзы, маршрутизаторы и прочий ужас, делающий обратное подключение невозможным. В общем, пока безрезультатно.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter