当前位置: 首页 > 知识库问答 >
问题:

客户端的两个线程可以使用来自服务器的相同输入流吗?

杜轩昂
2023-03-14

我正在开发一个Java客户机/服务器应用程序,它有一套非常具体的规则来说明我必须如何开发它。服务器创建一个ClientHandler实例,该实例具有到客户端套接字的输入和输出流,它们之间的任何输入和输出都由客户端GUI中的事件触发。

我现在添加了服务器端的功能,它将定期向所有连接的客户端发送更新(通过将ClientHandlers中创建的每个PrintWriter对象存储ArrayList 中来完成)。我需要一个等效的客户端机制来处理这些消息,并且被告知这需要在第二个客户端线程中发生,该线程的run()方法使用do...while(true)循环,直到客户端断开连接。

到目前为止,这一切对我来说都是有意义的,我所纠结的是两个线程将不得不共享一个输入流,并且基本上‘忽略’任何不属于它们处理的类型的消息。在我的脑海中,它应该是这样的:

假设来自服务器的每条消息都向所有人发送值为trueboolean,并向单个客户端发送值为false的消息...

Existing Client Thread
//method called from actionPerformed(ActionEvent e)
//handles server response to bid request
public void receiveResponse()
{
    //thread should only process to-specific-client messages
    if (networkInput.nextBoolean() == false)
    {
        //process server response...
    }
}


Second Client-side Thread
//should handle all messages set to all clients
run()
{
    do {
        if (networkInput.nextBoolean() == true)
        {
            //process broadcasted message...
        } while (true);
}

由于它们需要使用相同的输入流,我显然会添加一些synchronizedwait/notifice调用,但一般来说,我在这里要做的是可能的吗?或者尝试从同一输入流读入的两个线程会不会相互干扰太多?

请让我知道你的想法!

谢谢,马克

共有1个答案

申屠飞
2023-03-14

你可以做到这一点,尽管它将是复杂的测试和得到正确。多少才算“太多”,就看你了。更简单的解决方案是让一个读取线程将消息传递给两个工作线程。

ExecutorService thread1 = Executors.newSingleThreadedExecutors();
ExecutorService thread2 = Executors.newSingleThreadedExecutors();
while(running) {
    Message message = input.readMessage();
    if (message.isTypeOne())
        thread1.submit(() -> process(message));
    else if (message.isTypeTwo())
        thread2.submit(() -> process(message));
    else
        // do something else.
}
thread1.shutdown();
thread2.shutdown();
 类似资料:
  • 我想编写一个tcp服务器和客户端应用程序,在客户端使用相同端口号的情况下,它们之间有几个不同的连接。 据我所知,服务器有一个侦听器端口,当客户端调用它时,我会在服务器端为这个新连接获得一个新的套接字,当我调用它时 正当所以在服务器端,我可以识别我与这个新套接字的连接,并通过它发送数据。 现在,我的理解与客户端的问题。我打电话的时候会拿到插座 所以我只有一个插座。在 我可以指定远程地址等等。所以当我

  • 我正在用Netty玩Spring Webflux(2.0.3.Release),并试图理解服务器和web客户端是如何使用线程的。我用WebClient编写了一些带有http调用链的代码。我怀疑所有调用都是非阻塞的,但我不明白为什么只有一个请求经过整个链路。下面是代码和日志输出: 我对localhost:8080/1进行了4次调用,并得到以下输出。只有一个请求到达了第三个方法。我希望当一个线程被阻塞

  • 另外,两个应用程序不能在一台机器上使用相同的端口,那么当两个不同的服务器具有相同的端口,而一台机器需要通过两个不同的应用程序连接到这两个服务器时会发生什么呢?

  • 节点和HTTP2允许服务器向客户端提供多个响应。但是,如果客户端想要发送一个初始请求,而在服务器响应后,客户端想要发送进一步的消息呢?一个解决方案是创建一个新请求——但这似乎否定了双工流的好处。 简单服务器代码: 测试客户端代码: 生成ERR_HTTP2_STREAM_ERROR,因为我假设节点不支持客户端向同一个流写入两次?

  • 问题内容: 我正在尝试使用我一直在努力的客户端/服务器程序实现多线程。我需要允许多个客户端同时连接到服务器。我目前有4类:客户端,服务器,协议和用于处理线程的工作器。以下代码是我对这些类的拥有的代码: SocketServer类: SocketClient类别: 协议类别: ClientWorker类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示

  • 问题内容: 使用Go中的软件包,实际上是否可以从服务器向客户端进行RPC调用?如果没有,是否有更好的解决方案? 问题答案: 我目前正在使用Thrift(thrift4go)来实现服务器->客户端和客户端->服务器RPC功能。默认情况下,thrift仅像net / rpc一样执行客户端->服务器调用。由于还需要服务器与客户机之间的通信,因此我进行了一些研究并发现了bidi- thrift 。Bidi