Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

TIdTCPServer & TIdTCPClient не могу поймать отсоединение клиента   Найти похожие ветки 

 
Serguar   (2004-08-02 14:52) [0]

Здравствуйте.
Ни как не могу поймать отсоединение клиента на сервере. Событие ServerConnect при подключении клиента срабатывает четко. Когда на клиенте делаю Client.Disconnect он (клиент) тоже пишет что отсоединился, а на сервере в методе ServerDisconnect ни какой реакщии. Че делать?
Заранее благодарен.


 
Digitman ©   (2004-08-02 14:56) [1]


> Че делать?


привести сюда код обработчика события OnExecute


 
Serguar   (2004-08-02 15:39) [2]

Да я собственно OnExecute пока ничего не делаю. Пока просто проверяю connect/disconnect. Попробовал просто распечатывать текстовую строчку в методе OnExecute: срабатывает аж по 138 раз при нажатии в клиенте connect/disconnect. Как тогда фильтровать?


 
MetalFan ©   (2004-08-02 15:49) [3]

а вы понимаете, зачем вообще нужен OnExecute на IdTCPServer ?


 
Digitman ©   (2004-08-02 15:54) [4]


> на сервере в методе ServerDisconnect ни какой реакщии


тогда приводи обработчик события OnDisconnect


> OnExecute: срабатывает аж по 138 раз


а сколько, по-твоему, должно быть ? и на основании чего у тебя некие предположения по сему поводу ?


 
Serguar   (2004-08-02 16:06) [5]

>MetalFan

TIdTCPServer.OnExecute
Event handler for peer thread execution. Перевожу как умею: Обработчик события при запуске нитки (вызов метода TIdPeerThread.Run). Это из help. Я так понял, что использую этот метод при обмене данными между клиентом и сервером, а для перехвата событий connect/disconnect имеются специальные методы.

> Digitman
Для отладки использую CodeSite2. В обработчике события вставляю строчку типа printf в Си. Так вот в viewer"e этого инструмента идет подсчет срабатываний.


 
Digitman ©   (2004-08-02 16:25) [6]


> Для отладки использую CodeSite2


а чем обосновано упразднение тобой встроенного в Делфи дебагера ?


 
Serguar   (2004-08-02 16:28) [7]

Просто к CodeSite привык уже. Ставлю BreakPoint в обработчик OnDisconnect -> туда даже не попадает.

procedure TMainForm.TCPServerDisconnect(AThread: TIdPeerThread);
begin
 Memo.Lines.Add(Format("%s> Client disconnected: %s", [FormatDateTime("dd.mm.yyyy hh:mm:ss", Now), AThread.Connection.LocalName]));
end;


 
Digitman ©   (2004-08-02 17:09) [8]


> Serguar   (02.08.04 16:28) [7]


OnDisconnect is an event handler for a TIdServerThreadEvent. OnDisconnect occurs when the TIdPeerThread attempts to disconnect from a TCP server.

OnExecute вызывается циклически до тех пор, пока св-во
PeerThread.Connection.Connected = True

в обработчике OnExecute ты выполняешь чтение/запись с использованием объекта PeerThread.Connection

поскольку после отсоединения партнера по его инициативе любой метод чтения/записи объекта PeerThread.Connection вызовет исключение, ты можешь обработать его здесь же и установить PeerThread.Connection.Connected = False

можешь и не обрабатывать исключение, тогда его обработает сам TIdPeerThread и сам установит PeerThread.Connection.Connected = False

только при таком механизме и логике ты получишь событие OnDisconnect


> Memo.Lines.Add


а вот этого вообще нельзя делать без синхронизации с осн.трэдом


 
Serguar   (2004-08-03 07:45) [9]

> Digitman

> поскольку после отсоединения партнера по его инициативе любой метод чтения/записи объекта PeerThread.Connection вызовет исключение, ты можешь обработать его здесь же и установить PeerThread.Connection.Connected = False

Так мне что, для того что бы проверить не отсоединился ли клиент, нужно каждый раз делать чтение/запись? А зачем тогда на сервере вообще нужен обработчик OnDisconnect?

Вот код OnExecute сервера:

procedure TMainForm.TCPServerExecute(AThread: TIdPeerThread);
begin
 if Not AThread.Connection.Connected then
   ShowMessage("Client disconnected...");
end;
При вызове на клиенте
 if TCPClient.Connected then begin
   TCPClient.Disconnect;
 end
на сервере вышеописанный код не проходит.


 
Digitman ©   (2004-08-03 08:16) [10]


> зачем тогда на сервере вообще нужен обработчик OnDisconnect?


чтобы выполнить какие-то специфические действия при (см.цитату из справки) TIdPeerThread attempts to disconnect from a TCP server


 
Serguar   (2004-08-03 08:34) [11]

В поставке Indy9 есть каталог с примерами. Так вот там есть пример IdTCPDemo. Загружаю, смотрю: все работает четко. При отключении клиента, на сервере в memo добавляется строчка уведомляющая об отсоединении клиента именно в методе OnDisconnect. Буду разбираться.


 
Digitman ©   (2004-08-03 08:59) [12]


> там есть пример IdTCPDemo


обрати внимание, что в этом примере в обработчике OnExecute есть методы записи/чтения, при блокирующем выполнении которых ситуация дисконнекта кака раз и обнаруживается, что приводит к исключению, в обработчике по умолчанию которого и вызывается метод PeerThread.Connection.Disconnect (а в теле метода Disconnect возбуждается событие OnDisconnect)


 
Serguar   (2004-08-03 09:43) [13]


> Digitman


Все. Я понял. Тогда уж проще будет сделать так: перед отсоединением клиента, посылаю серверу сообщение об отсоединении. Тот в методе OnExecute отсоединяет его, что вызывает событие OnDisconnect. Хотел сразу так сделать. Просто не сразу понял как работает метод OnDisconnect на сервере. Спасибо за участие.


 
Reindeer Moss Eater ©   (2004-08-03 09:53) [14]

Все. Я понял. Тогда уж проще будет сделать так: перед отсоединением клиента, посылаю серверу сообщение об отсоединении

1. Не поможет.
2. Не проще.


 
Serguar   (2004-08-03 10:30) [15]


> Reindeer Moss Eater



> 1. Не поможет.

Уже работает


> 2. Не проще.

Научи как проще


 
Digitman ©   (2004-08-03 10:47) [16]


> Serguar   (03.08.04 10:30) [15]



> перед отсоединением клиента, посылаю серверу сообщение об
> отсоединении. Тот в методе OnExecute отсоединяет его, что
> вызывает событие OnDisconnect


это называется "в соседнюю комнату через Китай"

ты же все равно в OnExecute будешь вызывать какие-то Read-методы !

пока клиент активен и ничего не посылает, Read-метод "висит" (блокирует дальнейшее выполнение операторов тела обработчика) на время, равное указанному таймауту .. если в период таймаута ожидания ввода клиент по прежнему активен и ничего не посылает, Read-метод завершается успешно .. если же в период таймаута ожидания ввода клиент отсоединился, Read-метод возбудит исключение, и если ты не обработаешь это исключение, то его обработает сам PeerThread, вызвав Connection.Disconnect ... если же ты сам обрабатываешь исключение, то ты сам и должен в except-блоке вызвать Connection.Disconnect ! И все !! и никаких проблем и выкрутасов !!


 
Reindeer Moss Eater ©   (2004-08-03 11:10) [17]

> 1. Не поможет.
Уже работает
> 2. Не проще.
Научи как проще


Не поможет потому, что если сервер не читает, то ничего он не примет от клиента.

А если сервер читает/пишет, то никаких уведомлений на прикладном уровне типа "я ухожу" - вообще просто не надо.


 
Serguar   (2004-08-03 11:50) [18]

Черт возьми. Все оказалось гораздо проще. Обидно. Спасибо за помощь. Все понял.


 
Калашников   (2004-08-04 08:14) [19]

ОТСОСИ И ВСЁ ПОЛУЧИТЬСЯ (с) Калашников


 
Sh@Dow   (2004-09-07 07:58) [20]

Калашников урод. тебе бы такие проблемы, ты сам бы и отсосал.



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.056 c
1-1098988791
Victor
2004-10-28 22:39
2004.11.14
Подскажите: Как в ячейке StringList а не обрезался текст


1-1099132875
olevacho
2004-10-30 14:41
2004.11.14
как создать службу на Делфи


14-1098882807
Yuri Btr
2004-10-27 17:13
2004.11.14
Intel Signal Processing Library


14-1098792737
Erik1
2004-10-26 16:12
2004.11.14
Создание TMemDataSet для подержки древовидной структуры.


6-1094027486
bl4ck_w1nd
2004-09-01 12:31
2004.11.14
комп+модем+телефон