【问题标题】:How do I communicate with all threads on a Multithreaded server?如何与多线程服务器上的所有线程通信?
【发布时间】:2014-03-25 04:42:21
【问题描述】:

好的。我正在尝试掌握一些多线程 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 吗?一个用于内流,一个用于外流?我在这里在黑暗中摸索。

【问题讨论】:

    标签: java multithreading sockets network-programming client-server


    【解决方案1】:

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

    没有。

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

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

    【讨论】:

    • 谢谢。这就是我最终做的事情。我还让客户端成为多线程的,这样它就可以在一个线程中处理输入流,在一个线程中处理输出流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多