Форум: "Сети";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c