Форум: "Сети";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизПара вопросов по Indy... Найти похожие ветки
← →
$hade (2002-11-21 11:43) [0]Я уже когда-то задавал подобные вопросы...но...пока так и не разобрался....:((
1. В TIdTCPServer есть событие OnExecute - типа когда клиент запустил новый поток...
В этом событии можно читать данные от клиента когда тот их ПОСЫЛАЕТ.
На клиенте такого события нет - приходится читать в таймере...
Вот два примера кода:
1. Клиент
OnButton1Click
Client.SendBuffer(buf,sizeof(Buf));
OnButton2Click
Client.ReciveBuffer(buf,sizeof(Buf));
Сервер
OnExecute(AThread:TIDThread);
AThread.Connection.ReciveBuffer(Buf,sizeof(buf));
...
AThread.Connection.SendBuffer(Buf,sizeof(buf));
!! Это не конкретный код - просто пример...
так все работает...
2. 1. Клиент
OnButton1Click
Client.SendBuffer(buf,sizeof(Buf));
!! OnTimer !!
Client.ReciveBuffer(buf,sizeof(Buf));
Сервер
OnExecute(AThread:TIDThread);
AThread.Connection.ReciveBuffer(Buf,sizeof(buf));
...
AThread.Connection.SendBuffer(Buf,sizeof(buf));
А тут ж...sorry...вощщем на сервере событие OnExecute происходит уже и когда клиент читает,и когда пишет...
А КАК МНЕ ПОНЯТЬ НА СЕРВЕРЕ - ЧТО МНЕ С КЛИЕНТОМ ДЕЛАТЬ??
И еще маленький вопрос - кто разбирался c Indy в D7 (или с последними версиями вообще) - что за звери такие - I/O Handlers?
(типа - нет,все понятно - но что конкретно? :-))
P.S:В числе других особенно хотелось бы услышать мнение Digitman"а :-)
← →
Reindeer Moss Eater (2002-11-21 12:44) [1]На клиенте такого события нет - приходится читать в таймере...
А зачем клиенту что-то читать в OnTimer?
← →
Reindeer Moss Eater (2002-11-21 12:46) [2]А КАК МНЕ ПОНЯТЬ НА СЕРВЕРЕ - ЧТО МНЕ С КЛИЕНТОМ ДЕЛАТЬ??
Прочитать что пишет клиент и решить что с ним делать на основе соглашений собственного протокола обмена данными
← →
$hade (2002-11-21 13:04) [3]>А зачем клиенту что-то читать в OnTimer?
потому что нет события OnRead или OnWrite...
а как мне тогда узнать что от сервера вообще что то пришло??
мне нужно реагировать на сообщения от сервера...(не обязательно сервер ответить на мой запрос - он может и сам пакет послать...)
>Прочитать что пишет клиент и решить что с ним делать на основе соглашений собственного протокола обмена данными
я имел ввиду как раз - написал клиент или пытается читать?
← →
Reindeer Moss Eater (2002-11-21 14:05) [4]потому что нет события OnRead или OnWrite...
И что? Нет событий, а методы-то все на месте!
а как мне тогда узнать что от сервера вообще что то пришло??
В Indy методы синхронные. Надо вызвать метод, читающий данные. Возврата из него не будет пока не придут все данные, либо таймаут, либо дисконнект
я имел ввиду как раз - написал клиент или пытается читать?
Это не проблемы сервера. Он должен читать и писать. А что делает клиент - не его забота
← →
Reindeer Moss Eater (2002-11-21 14:13) [5]Конкретно обработчике OnExecute у сервера:
Если обработчик вызван, значит есть данные от клиента
← →
$hade (2002-11-21 14:36) [6]>Надо вызвать метод, читающий данные. Возврата из него не будет пока не придут все данные, либо таймаут, либо дисконнект
блин....ну вызвал я один раз...пришло....а потом?? мне же надо периодически (раз в 1 - 10 сек) получать данные...
>Это не проблемы сервера. Он должен читать и писать. А что делает клиент - не его забота
???? То есть как не его забота - писать читать и вормировать пакеты он ведь должен на основе данных полученных от клиента???
>Конкретно обработчике OnExecute у сервера:
Если обработчик вызван, значит есть данные от клиента
а нифига!! если я отсылаю клиентом - все так и есть...
если принимаю клиентом (по кнопке или 1 раз в коде - работает)...как только я засовываю процедуру приема в timer или Thread - OnExecute происходит даже когда клиент пытается прочитать....
вот примерный код процедуры OnTimer:
if not FConnected then exit;
Timer.Enabled := false;
try
if isHdr then
begin
Socket.ReadBuffer(PacketHeader,PacketHeaderSize);
if PacketHeader.Header <> pvCurrent then
begin
Socket.Disconnect;
exit;
end;
PacketType := GetPacketType(PacketHeader);
if PacketType = ptDisconnect then
Socket.Disconnect;
if GetDataSize(PacketHeader) = 0 then
begin
while DataStreamLocked do
AntiFreeze.Process;
DataStreamLocked := true;
FDataStream.Write(PacketHeader, PacketHeaderSize);
DataStreamLocked := false;
isHDR := true;
end
else
isHDR := false;
end;
if (not IsHDR) and FConnected then
begin
DataSize := GetDataSize(PacketHeader);
if DataSize <> 0 then
begin
while DataStreamLocked do
AntiFreeze.Process;
DataStreamLocked := true;
FDataStream.Write(PacketHeader, PacketHeaderSize);
Socket.ReadStream(FDataStream, DataSize);
//или ReadBuffer - неважно...
DataStreamLocked := false;
isHDR := true;
end; //Data<>0
end;
except
// например таймаут...
end;
DataStreamLocked := false;
Timer.Enabled := FConnected;
{прошу не прикапываться к коду по мелочам...просто методом тыка пытался решать вышеопиванную проблему...}
P.S: Вообще - используется протокол - оччень похожий на ICQ v7...
← →
Reindeer Moss Eater (2002-11-21 14:40) [7]блин....ну вызвал я один раз...пришло....а потом?? мне же надо периодически (раз в 1 - 10 сек) получать данные...
Про циклы в паскале слышал?
← →
Reindeer Moss Eater (2002-11-21 14:42) [8]Кто у тебя начинает сеас обмена данными?
← →
$hade (2002-11-21 14:49) [9]>Про циклы в паскале слышал?
Вау!! А че ета?? :-((
помимо приема данных надо еще иметь возможность по кнопочкам давить (как минимум)...представь себе асю в которой все крутичтя в цикле - нажал на кнопку - и ждеш когда у тебя уйдут 10 предидущих сообщений, скачается 15 баннеров и т.д. и только потом откроется окощко в настройками, да? :-)
(по крайней мере Я не умею выходить из цикла "на минуточу" - открыть окошко для записи сообщения по просьбе юзера - а потом вернуться обратно... )
и чем в принципе отличается применение цикла и таймера вот в конкретном моем примере ??
← →
Reindeer Moss Eater (2002-11-21 14:56) [10]помимо приема данных надо еще иметь возможность по кнопочкам давить (как минимум)...
TidAntiFreeze
← →
Reindeer Moss Eater (2002-11-21 15:05) [11]и чем в принципе отличается применение цикла и таймера вот в конкретном моем примере ??
Тикнул таймер, вызвал обработчик. В обработчике вызвался синхронный метод. С сервера ничего не приходит, и таймер успевает тикнуть еще раз. Вызывается обработчик в котором вызывается синхронный метод.
← →
Reindeer Moss Eater (2002-11-21 15:06) [12]Ну и так далее.....
← →
$hade (2002-11-21 15:16) [13]блин...для чего я пример кинул?? :-)
1.AntiZreeze
2.Timer отключается в начале....в конце включается....
← →
Reindeer Moss Eater (2002-11-21 15:20) [14]блин...для чего я пример кинул?? :-)
Тогда скажи мне, зачем таймер, если периодичность его срабатывания не имеет ничего общего с его Interval?
← →
$hade (2002-11-21 15:32) [15]ну вообще то когда работает таймер я могу чего либо делать...
то есть могут обрабатываться OnButtonClick , OnCreate,OnClose...да хоть что....хоть еще 5 таймеров одновременно...а вот как 5 циклов запустить например?
можно использовать ProcessMessage...тока толку...не ставить же его послекаждого оператора в цикле....+ все равно не сможешь обработать нажатие на кнопку...то есть пока цикл не закончился...ничего не сможещь делать...хотя и не будет висеть...
← →
Reindeer Moss Eater (2002-11-21 15:49) [16]то есть пока цикл не закончился...ничего не сможещь делать...хотя и не будет висеть...
Это не так
← →
Reindeer Moss Eater (2002-11-21 15:53) [17]Вот элементарный пример
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
while ATrue do
begin
Sleep(100);
Application.ProcessMessages;
Caption:="In Cycle";
end;
Caption:="Out Of Cycle";
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ATrue :=False;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
ShowMessage("Это сделано пока где-то крутится цикл");
end;
← →
$hade (2002-11-21 16:01) [18]ок....не проверил еще....но ежел что -извеняюсь....тока я не об этом все таки...какая в принципе разница что использовать...я не думаю что что-то изменится....седня проверю...завтра продолжим...)
← →
$hade (2002-11-22 05:45) [19]лана...согласен...я ошибался....(не совсем, правда)...
а вообще - вопрос был не об этом совершенно...
но проблема уже решена...ни за что не догадаешся как!!! :-)
просто по умолчанию в D не прописан путь к исходникам Indy - то есть она использует DCU...вот толи их криво билдили...то ли какой-то старый билд...не знаю - прописал путь - перебилдил проект и все - OnExecute на сервере вызывается только если клиент что-то написал...то есть то что и должно быть...
← →
$hade (2002-11-22 05:46) [20]Тока вот на второй вопрос вооще ничего не ответил никто - что такое IOHandlers??
← →
vor (2003-01-15 14:45) [21]не подскажите где скачать компоненты Indy в частности для работы с почтой пишите vorobev2002@mail.ru
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c