Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
4-1097040756
П7
2004-10-06 09:32
2004.11.14
Консольное приложение


3-1098064145
sanek
2004-10-18 05:49
2004.11.14
Как решить проблемму с вводом данных в поле string(254)


4-1096918358
X-RayMan
2004-10-04 23:32
2004.11.14
Точность...


14-1098448011
Qwest
2004-10-22 16:26
2004.11.14
Задачи.


14-1098430322
NewDelpher
2004-10-22 11:32
2004.11.14
Умение водить автомобиль





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский