Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите непонятливому!!!! Indy IdTCPClient -


Страницы:   1 2 3 4

tes ©   (2003-08-06 18:29:00) 

Помню раньше были компоненты TServerSocket TClientSocket, у клиента была такая тема как - ClientSocketRead, в Indy такого нет. Если ставить на таймер IdTCPClient.ReadLn то прога быстро уходит в мир иной (полное вислово) :( Подскажите каким образом нужно плучать ответы от IdTCPServer в клиенте. Задолбался уже.


Reindeer Moss Eater   (2003-08-07 14:44:00) [61]

Ну какая разница - пусть в таймере сделает...

До меня никак не может дойти смысл применения таймера для вызова синхронных методов. Красота и элегантность этой инженерной мысли никака не постигается мной.


$hade   (2003-08-07 14:40:00) [62]

Тьфу! Второй раз такая фигня :-)
Выше я был...


Tiny   (2003-08-07 14:39:00) [63]


> Reindeer Moss Eater © (07.08.03 14:31)

Ну какая разница - пусть в таймере сделает...

Но лучше - отдельный поток


Reindeer Moss Eater   (2003-08-07 14:31:00) [64]

procedure WorkWithServer;
var cStr:string;
begin
while True do
begin
cStr:=IdTCPClient.ReadLn;
if cStr = "go to bed" then Break
else if cStr = "Делай то" then ExeDelayToTo
else if cStr = "Делай cё" then ExeDelaySe
else ExeDoSomethind;
end;
end;


test   (2003-08-07 14:27:00) [65]

Reindeer Moss Eater

Если тебе не трудно, напиши маленький примерчик, в котором будет показана работа клиента с пакетами.


Reindeer Moss Eater   (2003-08-07 14:17:00) [66]

Дорогой, не нужен таймер.
Пойми сначало это. Потом продолжим.


test   (2003-08-07 14:07:00) [67]

Reindeer Moss Eater

Слушай, дорогой! Ты меня совсем не понимаешь. То, что ты сказал, это ясно и так. Меня интересует вопрос, как это оформить програмно. Ну -
procedure TForm1.TimerOnTimer;
Begin
Client.ReadLn;
End; - только такой вариант не подходит, виснет. Где ставить цикл или ... ?


Reindeer Moss Eater   (2003-08-07 14:04:00) [68]

Вопрос: Откуда клиент узнает, что ему прислали пакет?

Как только произойдет возврат из метода чтения, так значит "Вам пакет"


Reindeer Moss Eater   (2003-08-07 14:02:00) [69]

Утомил. Сервер может посылать мне сообщения в разные промежутки времени. Вопрос: Откуда клиент узнает, что ему прислали пакет? Для этого как я понимаю, нужно ставить обработчик, который будет контролить этот процесс -> возвращаемся туда, откуда пришли. :(

Соединившись с сервером, клиент должен читать. Прочитав, должен читать снова.


test   (2003-08-07 13:54:00) [70]

Reindeer Moss Eater

Утомил. Сервер может посылать мне сообщения в разные промежутки времени. Вопрос: Откуда клиент узнает, что ему прислали пакет? Для этого как я понимаю, нужно ставить обработчик, который будет контролить этот процесс -> возвращаемся туда, откуда пришли. :(


Reindeer Moss Eater   (2003-08-07 13:50:00) [71]

Тебе что, просто свой код некуда вставить кроме как в обработчики событий?

Теперь к клиенту. У него нет никакого события, ...
Нет события, потому что оно ему не надо. Серверу надо потому что он многопоточный и обслуживает многих клиентов.
Клиенту это не нужно. Клиент - он один.
Достаточно вызвать метод и получить от сервера данные.
Нужны еще данные, вызови метод еще раз.



test   (2003-08-07 13:46:00) [72]

Reindeer Moss Smoker (ex-RME)

Объясняю популярно. Мне нужно получать сообщения от серверной части. Если пользоваться событием OnConnect то получение данных происходит 1 раз, потом все пакеты идуд по извесному адресу (на ...) :( Почему - непонятно. Если ставить получение пакетов по циклу, прога подвисает. Ставить по таймеру, работает чуть дольше, но результат тотже. Если рассмотреть чат, из демо в инди, то можно увидеть, что там используется в качестве цикла на прием данных - таймер. Геморой полный! Для тех, кто не понял мою мысль, привожу ее в другой интерпретации:

В серверной части чтение пакетов происходит по событию OnExecute.
Все работает как надо.

procedure tform1.idtcpserveronexecute;
Begin
With iIdTCPServer Do
Begin
IdTCPServer.ReadLn ("xxx");
// ...
End;
End;

Теперь к клиенту. У него нет никакого события, которое бы постоянно принимало от сервера пакеты. В старом было OnClientRead, в нди нет. По этому нужно ставить цикл. Вариант
With IdTCPClient Do
Begin
ReadStr := IdTCPClient.ReadLn;
End;

не проходит. :( Что делать?


Reindeer Moss Smoker (ex-RME)   (2003-08-07 13:26:00) [73]

Ты сам себе можешь объяснить зачем тебе потребовался таймер?


Reindeer Moss Smoker (ex-RME)   (2003-08-07 13:25:00) [74]

"Старый" клиент имел асинхронные методы, "новый" имеет синхронные.


test   (2003-08-07 13:22:00) [75]

Reindeer Moss Smoker (ex-RME)

MyString := IdTCPClient.ReadLn - не, у это понятно. Я не про то спрашивал. Вот у старого клиента была такая фишка, как OnClientRead, а в инди на клиенте такого нет. Приходится извращаться. На событии OnConnect - срабатывает всего раз, если по таймеру, то срабатывает как надо, только виснет. Вот чего я спрашивал. Может есть какой вариант, аналогично старому.


Reindeer Moss Smoker (ex-RME)   (2003-08-07 13:07:00) [76]

Начало примера
MyString:=IdTCPClient.ReadLn
Конец примера


test   (2003-08-07 12:58:00) [77]

Если Вас не затруднит, примерчик пожалйста.


$hade   (2003-08-07 11:29:00) [78]


> Подскажите каким образом нужно плучать ответы от IdTCPServer
> в клиенте

В отдельном потоке
или
ReadLn("",5) (таймаут 5 мс - практически не тормозит...)
или
точнее даже "и"
кинь на форму компонент IdAntiFreeze


Reindeer Moss Eater   (2003-08-07 08:36:00) [79]

Если ставить на таймер IdTCPClient.ReadLn

Зачем на таймер? Почему не на тормоз?

IdTCPClient.ReadLn без таймера не работает что ли?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо