Как сохранить идентификатор в ListView клиентского подключения - Indy 10 - PullRequest
1 голос
/ 03 декабря 2011

Я создаю TCP-сервер, который принимает несколько клиентов и должен иметь возможность отправлять сообщения каждому.

Как получить дескриптор клиентского соединения и затем отправить произвольные данные?

Спасибо: D

Код:

procedure TFRM_Main.ServerConnect(AContext: TIdContext);
var lAdd: TListItem;
var Index: integer;
begin
  lAdd := ListView.Items.Add;
  //AContext connection ID, what to do here?
  lAdd.Caption := IntToStr(Index);
end;

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

TIdTCPServer - многопоточный компонент. Доступ к пользовательскому интерфейсу напрямую из события OnConnect (или OnDisconnect, OnExecute или OnException) не является поточно-ориентированным! Вам необходимо использовать класс Indy TIdSync или TIdNotify для безопасного доступа к пользовательскому интерфейсу.

Чтобы ответить на исходный вопрос, самый простой, но не обязательно самый безопасный способ - сохранить указатель объекта TIdContext.Connection в свойстве TListItem.Data. Код основного потока получит прямой доступ к соединению, когда оно ему потребуется.

Я не советую этого, хотя. Более безопасным решением является уникальная идентификация каждого клиента самостоятельно, например, с помощью имени пользователя, которое отправляет клиент, и сохранение этого идентификатора в свойствах TIdContext.Data и TListItem.Data. Затем, когда ваш код основного потока хочет отправить сообщение клиенту, он может перебрать список TIdTCPServer.Contexts в поисках нужного идентификатора, и, если он будет найден, он получит доступ к соответствующему объекту TIdContext.Connection.

1 голос
/ 05 декабря 2011

use:

AContext.Connection.IOHandler.Write( (* bytes *) );
AContext.Connection.IOHandler.WriteFile( (* send a file to the client *) );

Для получения дополнительных опций просто вызовите завершение кода (CTRL + SPACE) после IOHandler и посмотрите доступные опции, некоторое время назад я написал простое тестовое приложение клиент / сервернажмите здесь , чтобы увидеть и / или загрузить источник.

...