如何使 2 个服务器线程与 2 个客户端线程通信?

How to make 2 server threads communicate with 2 client threads?

我基本上是想实现这个:

ServerThreadA                         ClientThreadA
             \                       /
               --->>>--->>>--->>>---
                      SOCKET
               --->>>--->>>--->>>---
             /                       \
ServerThreadB                         ClientThreadB  

这里发生的事情是我在服务器上有 2 个线程将数据发送到客户端的 2 个相应线程。更具体地说,我需要在服务器上使用来自 DataOutputStream 的 .writeUTF(String) 和来自客户端 DataInputStream 的 .readUTF() 。

当 ServerThreadA 向流中写入内容时,只有 ClientThreadA 可以读取它,而 ClientThreadB 则不能。同样,我不希望 ClientThreadB 读取 ServerThreadA 所写的内容。

有什么办法可以做到这一点吗?

编辑:
我想我可能解释得不好:我已经知道如何制作一个可以接受多个连接并给每个连接一个线程来处理的服务器,我正在尝试的是让多个通信在同一个方向上进行在同一个客户端。所以假设服务器连接到客户端,创建了一个线程来表示连接,但我想做的是从 2 个不同的通道读取,如果你愿意的话,传输不同类型的数据。例如,我可能希望客户端同时发送两个字符串,而服务器同时读取它们

我认为您对服务器应如何工作的理解是错误的。那张照片应该很像:

ServerThreadA --->>>--->>>--->>>--- ClientThreadA

ServerThreadB --->>>--->>>--->>>--- ClientThreadB

要点是:服务器代码等待一个服务器套接字;当一个新客户进来时 accept() 给你一个 "dedicated" 套接字来与那个客户交谈。

换句话说:无论有多少客户端线程连接到你的服务器;无论有多少服务器线程处理它们;每个客户端总是一个特定套接字

没有套接字共享;因此无需担心消息可能会发送给多个客户端!

并且当您考虑 "sharing" 套接字允许一侧向另一侧的 所有 对等点发送消息时,您需要使用不同的方式!

您可以对服务器使用 ServerSocket,其中服务器接受客户端传递或调用的 端口号

两者使用相同的端口号进行通信。

许多客户端可以调用服务器。当客户端请求(在该端口号上)服务器接受客户端请求时,这意味着客户端加入服务器....

更改协议,以便在每个字符串之前写入一个数字:如果消息是针对 ClientThreadA 的,则为 0;如果消息是针对 ClientThreadB 的,则为 1。

在服务器端,启动一个ClientThread0,它应该从套接字读取所有输入数据。它读取一个数字,然后循环读取一个字符串。然后根据数字将字符串传递给适当的线程。要将消息从 ClientThread0 传递到 ClientThreadA/B,使用 BlockingQueue<String>s。 ClientThread0 调用 queue.put(string),ClientThreadA/B 调用 queue.take()