2011-12-03 6 views
1

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

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

спасибо: 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; 
+0

можете ли вы разместить код? – ComputerSaysNo

+0

@DorinDuminica Готов, код добавлен! –

ответ

1

использование:

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

Для получения дополнительных возможностей, просто вызовите завершение кода (CTRL + ПРОБЕЛ) после IOHandler и доступных вариантов, некоторое время назад я написал простую тестовую программу для клиентов и серверов, нажмите here, чтобы увидеть и/или загрузить исходный код.

3

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^