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

时间:2014-02-23 18:05:14

标签: 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();
}

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吗?一个用于流入,一个用于流出?我在这里黑暗中摸索着。

1 个答案:

答案 0 :(得分:1)

“有没有办法从主线程调用正在运行的线程中的方法?”

没有

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

当然,您必须同步每个客户端线程对Client对象outputStream的使用以及服务器线程对相同流的使用。您还可能必须处理不会永远持续的客户端连接(必须以某种方式从集合中删除其客户端对象。)