Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何与多线程服务器上的所有线程通信?_Java_Multithreading_Sockets_Network Programming_Client Server - Fatal编程技术网

Java 如何与多线程服务器上的所有线程通信?

Java 如何与多线程服务器上的所有线程通信?,java,multithreading,sockets,network-programming,client-server,Java,Multithreading,Sockets,Network Programming,Client Server,嗯。我试图掌握一些多线程Java概念。我知道如何设置多客户端/服务器解决方案。服务器将为每个连接的客户端启动一个新线程 概念上像这样 Server.java: while (true) { Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress().getHostAddress() + " connected"); new ClientHandler(socket).start()

嗯。我试图掌握一些多线程Java概念。我知道如何设置多客户端/服务器解决方案。服务器将为每个连接的客户端启动一个新线程

概念上像这样

Server.java:

while (true) {
  Socket socket = serverSocket.accept();
  System.out.println(socket.getInetAddress().getHostAddress() + " connected");
  new ClientHandler(socket).start();
}
ClientHandler.java循环是:

while(true)
{
    try {
         myString = (String) objectInputStream.readObject();
    } 
    catch (ClassNotFoundException | IOException e) {
        break;
    }   

    System.out.println(myClientAddress + " sent " + myString);

    try {
        objectOutputStream.writeObject(someValueFromTheServer);
        objectOutputStream.flush();
    } 
    catch (IOException e) {
        return;
    }
}
这只是一个概念来把握的想法。现在,我希望服务器能够同时向所有客户端发送相同的对象或数据

因此,我必须让服务器与每个线程通信。比方说,我希望服务器生成具有特定时间间隔的随机数,并将它们发送给客户端

我应该在服务器中使用线程可以访问的属性吗?有没有一种方法可以直接从主线程调用正在运行的线程中的方法?我不知道从这里到哪里去

奖金问题: 我也有另一个问题。。。这在代码中可能很难看到。但我希望每个客户端都能够从服务器接收消息,并独立地向服务器发送消息。现在,我可以让客户端站起来,等待gui提供要发送的内容。发送后,客户机将等待服务器返回它将提供给gui的内容。你可以看到我的ClientHandler也有这个问题

这意味着,当客户端等待服务器发送内容时,它无法向服务器发送任何新内容。此外,当客户机等待gui向其发送某些内容时,它无法从服务器接收

我只制作了一个服务器/客户端应用程序,它使用服务器处理从客户端接收的数据,然后将处理后的数据发送回服务器

有人能告诉我这个方向吗?我想我需要帮助如何在那里进行概念性思考。我应该有两个不同的ClientHandler吗?一个用于河道内,一个用于河道外?我在黑暗中摸索。

有没有办法从主线程在运行的线程中调用一个方法

没有

解决问题的一个简单方法是让“服务器”线程将广播发送到每个客户端。它可以将所有活动的客户端对象保留在一个集合中,而不是简单地创建新的客户端对象并释放它们(如您的示例中所示)。当发送广播消息时,它可以迭代所有客户机对象,并对每个对象调用sendBroadcast()方法


当然,您必须将每个客户端线程对客户端对象outputStream的使用与服务器线程对相同流的使用同步。您可能还必须处理无法永久使用的客户端连接(它们的客户端对象必须以某种方式从集合中删除。)

谢谢。这就是我最后做的。我还将客户机设置为多线程,这样它可以在一个线程中处理输入流,在一个线程中处理输出流。