![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление списка клиентов ClientSocket
NetMan2 © (2004-03-17 13:01:00)У меня программы с помощью компонентов ClientSocket и ServerSocket обмениваются информацией по сети. Есть список активных клиентов, то есть подключённых в данный момент. Как мне сделать чтобы он автоматически обновлялся, при подключении или отключении коиента. Обрабатываю событие OnClientConnect, всё нормально, а на OnClientDisconnect не реагирует. Приходится в ручную обновлять.
Digitman (2004-03-17 13:34:00) [1]
> а на OnClientDisconnect не реагирует
потому что отключившийся клиент (т.е. тот кто явился причиной возбуждения данного события) в момент обработки события (вплоть до возврата из обработчика) все еще фигурирует в списке ActiveConnections (он будет исключен из упомянутого списка СРАЗУ же после завершения тобой обработки события) .. так устроен TServerSocket .. и правильно он устроен, потому что смысл события OnClientDisconnect - указать тебе на клиента, который только что отключился, чтобы ты отреагировал на это событие нужным тебе образом
вариантов привести твой собственный виз.список активных коннектов в соответствие со внутренним списком ActiveConnections всего два : синхронный и асинхронный
к примеру, пусть список активных коннектов у тебя отображается средствами ListView
рассмотрим, например, синхронный вариант
В событии OnClientConnect ты добавляешь новый TListItem к своему списку и ассоциируешь его с ДАННЫМ клиентом
li := ListView.Items.Add;
//Socket - это 2-й параметр метода-обработчика события
li.Data := Socket; //прямая ссылка
Socket.Data := li; //реверсивная ссылка
В событии OnClientDisconnect ты удаляешь TListItem, ассоциированный с ДАННЫМ клиентом, из своего списка
//Socket - это 2-й параметр метода-обработчика события
или
TListItem(Socket.Data).Delete; //поиск по прямой ссылке
или
ListView.FindData(0, Socket, True, False).Delete; //поиск по реверсивной ссылке
Digitman (2004-03-17 13:34:00) [2]
> а на OnClientDisconnect не реагирует
потому что отключившийся клиент (т.е. тот кто явился причиной возбуждения данного события) в момент обработки события (вплоть до возврата из обработчика) все еще фигурирует в списке ActiveConnections (он будет исключен из упомянутого списка СРАЗУ же после завершения тобой обработки события) .. так устроен TServerSocket .. и правильно он устроен, потому что смысл события OnClientDisconnect - указать тебе на клиента, который только что отключился, чтобы ты отреагировал на это событие нужным тебе образом
вариантов привести твой собственный виз.список активных коннектов в соответствие со внутренним списком ActiveConnections всего два : синхронный и асинхронный
к примеру, пусть список активных коннектов у тебя отображается средствами ListView
рассмотрим, например, синхронный вариант
В событии OnClientConnect ты добавляешь новый TListItem к своему списку и ассоциируешь его с ДАННЫМ клиентом
li := ListView.Items.Add;
//Socket - это 2-й параметр метода-обработчика события
li.Data := Socket; //прямая ссылка
Socket.Data := li; //реверсивная ссылка
В событии OnClientDisconnect ты удаляешь TListItem, ассоциированный с ДАННЫМ клиентом, из своего списка
//Socket - это 2-й параметр метода-обработчика события
или
TListItem(Socket.Data).Delete; //поиск по прямой ссылке
или
ListView.FindData(0, Socket, True, False).Delete; //поиск по реверсивной ссылке
FireMan_Alexey (2004-03-17 13:07:00) [3]Хотел тебе напомнить, что КОД показывать желательно!!!
FireMan_Alexey (2004-03-17 13:06:00) [4]В событии OnClientError добавь Socket.Disconnect(Socket.SocketHandle);
Error:=0;