|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблема при передачи данных при помощи Indy
Есть такая проблема.
Пишу программку для обмена данными между Сервером и клиентом. Использую для этого Indy (idTCPServer и idTCPClient). До сих пор (пока и сервер и клиент запускались на одной машине) все было нормально, а вот стоило их разнести получилось следующее. Клиент отправляет серверу запрос, тот в свое время его обрабатывает, в лог-файле пишет, что все нормально и отправляет клиенту ответ, но вот до клиента он не доходит. Напомню, что пока сервер и клиент работали на одной машине все было нормально. Подскажите, кто знает, с чем это может быть связано. |
#2
|
||||
|
||||
Они в локалке, или в нете? Если в нете, то возможно роутеры шалят с пакетами...
И в любом случае, посмотри, не ругается ли брэндмауер (форточный). Или, может быть, фаервол стоит, его тоже надо проверить... ЗЫ: Информации маловато. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
|||
|
|||
Firewall "форточный" отключен, другие не стоят.
Приведу пример кода. Клиент по нажатию кнопки отправляет серверу запрос. Код:
procedure TForm1.Button1Click(Sender: TObject); Var S_Out : TStrings; begin S_Out:=TStringList.Create; ... //Забиваю в S_Out данные (порядка пары сотен строк) TCPClient_DB.WriteStrings(S_Out,True); S_Out.Free; end; Сервер, получая запрос, обрабатывает его и отправляет клиенту ответ. Код:
procedure TS_Server.TCPServerExecute(AThread: TIdPeerThread); Var S_In : TStrings; S_Out : TStrings; begin S_In:=TStringList.Create; S_Out:=TStringList.Create; AThread.Connection.ReadStrings(S_In); ... //Обработка данных S_In и формирование данных S_Out (порядка одной тысячи строк) AThread.Connection.WriteStrings(S_Out,True); S_In.Free; S_Out.Free; end; Клиент по таймеру проверяет наличие данных от сервера. Код:
procedure TForm1.T_DB1Timer(Sender: TObject); Var S_In : TStrings; begin S_In:=TStringList.Create; If Form1.TCPClient_DB.Connected Then begin Try Form1.TCPClient_DB.ReadStrings(S_In); If (S_In.Count>0) Then begin ... //Обработка данных S_In end; Except On EIdReadTimeOut Do ; Else Form1.TCPClient_DB.Disconnect; end; end; S_In.Free; end; При этом, если клиент и сервер находятся на одной локальной машине, то все работает отлично. Но стоит их разместить на разных машинах локальной сети, то данные перестают даходть до клиента. Повторюсь, что запрос от клиента до сервера доходит в целости и сохранности и более того сервер отправляет ответ клиенту (обо всем этом говорят log-файлы, которые я веду), но до клиента он не доходит. Буквально вчера вечером обнаружил такую особенность - если нажимать на кнопку у клиента несколько раз, то данные все таки приходят от сервера, но это происходит хаотично. Т.е. иногда приходит каждый пятый ответ, иногда -десятый. |
#4
|
||||
|
||||
Суть понятна... Indy TCP *** - я читал, они вообще лагнутые... Если хочешь - скинь в мыло (popyurv@front.ru) план (что, куда и зачем делает прога), нарежу на TServerSocket и TClientSocket.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#5
|
|||
|
|||
Проблема отпала после обновления Indy до версии 10.
|