1

目前我正在开发 Java 客户端/服务器聊天应用程序并遇到一个问题,我会尽量解释清楚。

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类中有一个 getter 方法,我想从基于套接字的某个ServerThread实例中调用它。但是ServerThread类没有分配给任何变量,所以我不知道如何从中调用方法。有什么解决办法吗?

4

1 回答 1

1

很简单,您需要找到并找到要强制调用方法的线程,您将保留您创建的每个线程,我建议您用于保留客户端的 Map 将在 < 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
     }
} 

最后,每当您希望客户端运行特定方法时,只需在找到客户端(ServerThread)实例后,通过 ClientMethodCaller 调用目标方法

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

最后一句话,这不好,为任何客户端登录运行一个线程,如果程序不小,用户数量太多。也检查这个教程,会有所帮助

于 2013-06-27T16:24:31.930 回答