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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pigmo

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

#1

投稿記事 by pigmo » 10年前

こんにちは。以前Javaに関して質問させて頂いた者です。
現在、通信を行うプログラムを作ってみようと勉強しております。

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

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

コード:

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

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

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

コンパイルしていませんが、例えばこんな感じでしょうか?
※コードはイメージです。このままコンパイラに投げても動きません。

コード:

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と接続しているスレッドを取得

	}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

pigmo

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

#3

投稿記事 by pigmo » 10年前

みけCATさん

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

閉鎖

“C言語何でも質問掲示板” へ戻る