ページ 11

スレッドを用いた1対多ソケット通信でクライアントを識別したい

Posted: 2015年6月01日(月) 14:10
by pigmo
こんにちは。以前Javaに関して質問させて頂いた者です。
現在、通信を行うプログラムを作ってみようと勉強しております。

環境
言語:Java / IDE:Eclipse / OS:Windows7

今回も同様にJavaで開発していて困っている事なのですが、TCP/IPソケット通信で、例えば次のようにしてサーバーが受け付けた接続をスレッドに振るとします。(抜粋です。すいませんが、分かりづらければご指摘下さい)

コード:

while(true) {
    // 接続受付
    Socket clientSocket = serverSocket.accept();
    // ソケットをスレッドに登録してスタート
    new Thread(ServerClass(clientSocket)).start();
}
こうすると、接続が確立するたびにスレッドが生成されていくと思うのですが、次の事で躓いてしまいました。

こういった複数のクライアントから接続されている時、各クライアント情報とスレッドをサーバー内部で紐付けて識別したいと思っています。例えば、サーバー側から、接続されている中であるクライアントAにのみメッセージを送信したい時、サーバー内部で複数スレッドが存在する中、どのスレッドがAと接続しているスレッドかを区別してメッセージ送信命令を出したいのです。

ウェブ上のサンプルコード等で勉強させて頂いているのですが、実装の糸口すら掴めず困っています。
ご存知の方がいらっしゃいましたら教えて欲しいです。
よろしくお願いします。

Re: スレッドを用いた1対多ソケット通信でクライアントを識別したい

Posted: 2015年6月01日(月) 22:36
by みけCAT
コンパイルしていませんが、例えばこんな感じでしょうか?
※コードはイメージです。このままコンパイラに投げても動きません。

コード:

class ClientInfo {
	// メンバを適宜用意

	public ClientInfo(Socket s) {
		// sからクライアントの情報を取得
	}
}


class Server {
	java.util.Map<ClientInfo, Thread> clients = java.util.Collections.synchronizedMap(new java.util.HashMap<ClientInfo, Thread>());

	void hoge() {

		while(true) {
			// 接続受付
			Socket clientSocket = serverSocket.accept();
			// ソケットをスレッドに登録してスタート
			Thread t = new Thread(ServerClass(clientSocket));
			clients.put(new ClientInfo(clientSocket), t);
			t.start();
		}

	}

	void fuga() {

		ClientInfo ci = (クライアントAの情報を持つClientInfoクラスのインスタンス);
		Thread t = clients.get(ci); // クライアントAと接続しているスレッドを取得

	}
}

Re: スレッドを用いた1対多ソケット通信でクライアントを識別したい

Posted: 2015年6月02日(火) 15:31
by pigmo
みけCATさん

ご回答ありがとうございます。
勉強不足のため丸ごと理解できたとはいえませんが、処理のイメージをつかむことができたので、提示して頂いたコードに沿って挑戦してみたいと思います。