Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-17161
Radion
2003-02-23 17:30
2003.03.06
А как, с помошю цикла, наити самое большое число в Массиве?


1-17117
Alessio2003
2003-02-22 00:13
2003.03.06
Доступ к RichEdit


1-17031
jen_bond
2003-02-25 08:59
2003.03.06
Реализация дерева


3-16919
Chainik2003
2003-02-15 19:00
2003.03.06
Выборка из нескольких таблиц


9-16848
RavenD
2002-10-04 21:12
2003.03.06
Движение в DirectX.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский