さて、最初に、ソリューションを提供する前に、ソケットがどのように機能するかについての簡単な背景を説明しましょう。何が起こっているのかを理解することが重要です。
ソケット説明(リファレンス)
ソケットは、サーバープログラムと1つ以上のクライアントプログラム間の双方向通信を確立するソフトウェアエンドポイントです。双方向という言葉に注意してください。これは、クライアントとサーバー間の接続ごとに、入力ストリームと出力ストリームの2つのストリームがあることを意味します。これらには、サーバー側とクライアント側の両方で設定されたソケットオブジェクトからアクセスできます。

あなたの問題
サーバーからクライアントへ私はplayer[i].out.writeUTF(message)を実行し、クライアントは彼の「in」をチェックしてin.readUTF()を実行し、すべて正常に動作します。クライアントからサーバーへ私はクライアントからout.writeUTF(message)を実行しますが、サーバー側では1人のplayer [i] .inを選択して、どちらのプレーヤーかわからないものを読み取る必要があります。
したがって、私が正しく理解していれば、どのクライアントがあなたにメッセージを送信したかを判断する方法が困難です。マルチスレッドを正しく使用すると、各クライアントが別々のスレッドで処理されるため、これは簡単に解決できます。
重要なステップは、クライアントが最初にどのように処理されるかです。次のコードを検討してください。短くするために、私は慣習にあまり焦点を合わせませんでした。
ArrayList<ClientWorker> clientWorkers = new ArrayList<ClientWorker>();
int idCounter = 0;
public void listenSocket(){
try{
int port = 9090
server = new ServerSocket();
} catch (IOException e) {
System.exit(-1);
}
while(true){
ClientWorker w;
try{
//server.accept returns a client connection
clientWorker = new ClientWorker(server.accept(), idCounter, );
idCounter++;
clientWorkers.add(clientWorker);
Thread t = new Thread(clientWorker);
t.start();
} catch (IOException e) {
System.exit(-1);
}
}
}
そのコードを通して、新しいクライアントを処理し、それらに一意のキーを割り当てています。サーバーに接続しているユーザーの数に応じてサイズを増減できるように、配列の代わりに配列リストを使用しています。クライアントを受け取ったら、clientWorkerインスタンスを作成します。さらに、接続されているユーザーごとに一意のキーが割り当てられ、アレイリストからオブジェクトをフェッチするために使用できます(必要な場合)。
ClientWorkerクラスは次のようになります。
class ClientWorker implements Runnable {
private Socket client;
public int id
//Constructor
ClientWorker(Socket client, int id) {
this.client = client;
this.id = id;
}
public void run(){
String line;
BufferedReader in = null;
PrintWriter out = null;
try{
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("in or out failed");
System.exit(-1);
}
while(true){
try{
//ANY DATA I GET FROM THIS STREAM IS FROM THIS PARTICULAR CLIENT ONLY!
line = in.readLine();
System.out.println("RECEIVED FROM CLIENT "+ id +" " + line);
}catch (IOException e) {
System.exit(-1);
}
}
}
}
このスレッドはrun()メソッドを呼び出します。各クライアントには個別のスレッドがあるため、特定のスレッドから処理されるデータは、他の誰かではなく、その特定のクライアントから送信されます。したがって、各クライアントのデータを簡単に区別できます。
長い答えでごめんなさい。私が自分のポイントに到達するまでに少し時間がかかりました。
参考文献