1

現在、私は Java クライアント/サーバー チャット アプリに取り組んでおり、質問が 1 つあります。できるだけ明確に説明しようと思います。

new ServerThread私のサーバー部分は、オンラインになったユーザーごとにスレッド ( ) を作成し続けます。

while (isRunning) {
    Socket socket = serverSocket.accept();
    DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
    outputStreams.put(socket, dout);
    System.out.println (outputStreams.values());
    new ServerThread(this, socket); 
    window.newConnectionInfo(socket);// informace
}

ソケットに基づいて特定のServerThreadインスタンスから呼び出したいServerThreadクラスに getter メソッドがあります。しかし、ServerThreadクラスはどの変数にも割り当てられていないため、そこからメソッドを呼び出す方法が正確にはわかりません。それに関する解決策はありますか?

4

1 に答える 1

1

簡単です。メソッドを強制的に呼び出したいスレッドを見つけて見つける必要があります。作成したすべてのスレッドを保持します。クライアントを保持するために使用しているマップは < ServerThread ,DataOutputStream > にあることをお勧めします。これですべてのスレッド (および ServerThread 内の Scoket インスタンス) ができました。わかりました。答えです。

まず、次のように、ServerThread でターゲット スレッドにシグナルを送るためのメソッドが必要です。

class ServerThread{
public void forceToCall(Object o){//an object argument, would be void too, or an interface
    //do something, call someone
  }
}

では、誰がこのメソッドを呼び出すのでしょうか? このように、ターゲットクライアントの同期または非同期モードを呼び出すクラスを作成するだけです

class ClientMethodCaller implements Runnable{
     ServerThread st;Object arg
     public ClientMethodCaller(ServerThread st,Object arg){this.st=st;this.arg=arg;}
     public void run () {
        st.forceToCall(arg);//signalling the client async
     }
} 

最後に、クライアントに特定のメソッドを実行させたいときはいつでも、client(ServerThread) インスタンスを見つけた直後に、ClientMethodCaller によってターゲット メソッドを呼び出します。

ServerThread st;//got the instance
new Thread(new ClientMethodCaller(st,"Hello!")).start();

最後の言葉は、これは良くありません。プログラムの場合、クライアントのログインに対してスレッドを実行することは少なくなく、ユーザーの数が多すぎます。このチュートリアルもチェックしてください。

于 2013-06-27T16:24:31.930 に答える