2011-12-03 8 views
1

複数のクライアントを受け取り、それぞれにメッセージを送信できるTCPサーバーを作成しています。ListViewに識別子を格納する方法クライアント接続 - Indy 1

クライアント接続のハンドルを取得してから任意のデータを送信するにはどうすればよいですか?

ありがとう: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 *)); 

は、単に、IOHandler後にコード補完(CTRL +スペース)を起動し、利用可能なオプションを表示しますいくつかの時間前に、私はシンプルなクライアント/サーバーテストアプリを書いて、hereをクリックしてソースを見たり/ダウンロードしたりします。

3

TIdTCPServerは、マルチスレッドコンポーネントです。 OnConnectイベント(またはOnDisconnectOnExecute、またはOnException)内から直接UIにアクセスすることは、スレッドセーフではありません。 UIに安全にアクセスするには、IndyのTIdSyncまたはTIdNotifyクラスを使用する必要があります。

元の質問に答えるには、もっとも簡単で安全な方法は、オブジェクトポインタをTListItem.Dataプロパティに格納することです。メインスレッドコードは、必要に応じて接続に直接アクセスします。

私はそれを助言しません。より安全な解決策は、クライアントが送信するユーザー名など、各クライアントを一意に識別し、そのIDをTIdContext.DataおよびTListItem.Dataプロパティに格納することです。次に、メインスレッドコードがクライアントにメッセージを送信したいときは、TIdTCPServer.Contextsのリストをループして目的のIDを探し、見つかった場合は対応するTIdContext.Connectionオブジェクトにアクセスします。

関連する問題