好。我正在尝试掌握一些多线程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给它发送东西时,它不能从服务器接收。
我只制作了一个服务器/客户端应用程序,该应用程序使用服务器来处理从客户端接收到的数据-并将处理后的数据发送回去。
有人可以指出我的任何方向吗?我认为我需要帮助,以便在那里进行概念性思考。我应该有两个不同的ClientHandlers吗?一种用于上游,一种用于下游?我在黑暗中摸索。
最佳答案
“有没有办法从主线程中调用正在运行的线程中的方法?”
没有。
解决问题的一种简单方法是让“服务器”线程将广播发送给每个客户端。与其简单地创建新的Client对象并放任它们(如您的示例),不如将所有活动的Client对象保留在一个集合中。当需要发送广播消息时,它可以遍历所有Client对象,并在每个对象上调用sendBroadcast()方法。
当然,您必须将每个客户端线程对Client对象outputStream的使用与服务器线程对相同流的使用进行同步。您可能还需要处理不会永远持续的客户端连接(必须以某种方式将其Client对象从集合中删除)。