【问题标题】:How to make 2 server threads communicate with 2 client threads?如何使 2 个服务器线程与 2 个客户端线程通信?
【发布时间】:2017-04-08 18:19:42
【问题描述】:

我基本上是想实现这个:

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

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

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

有什么方法可以实现吗?

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

【问题讨论】:

    标签: java multithreading sockets inputstream outputstream


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以将ServerSocket用于服务器,服务器接受客户端传递或调用的端口号

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

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

      【讨论】:

      • 我想我可能解释得不好:我已经知道如何制作一个可以接受多个连接并为每个连接提供一个线程来处理的服务器,我想要的是拥有多个通信在同一方向和同一客户端中进行。因此,假设服务器连接到客户端,创建了一个表示连接的线程,但我想要做的是从 2 个不同的通道读取,如果你愿意的话,传输不同类型的数据。例如,我可能希望客户端同时发送两个字符串,而服务器同时读取它们
      • 您的意思是两个不同的客户端将两个不同的数据发送到单个服务器并且服务器同时接受这两个数据..
      • 不,每个客户端向服务器发送两个不同的数据。问题是它必须使用多线程同时发生
      • 好的,然后用两个不同的名称创建两个不同的客户端并通过线程调用。
      【解决方案3】:

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

      ServerThreadA --->>>--->>>--->>>--- ClientThreadA
      
      ServerThreadB --->>>--->>>--->>>--- ClientThreadB
      

      重点是:服务器代码在一个服务器套接字上等待;当一个新客户进来并且accept() 给你一个“专用”套接字来与那个客户交谈时。

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

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

      当您考虑“共享”套接字以允许一侧向另一侧的所有对等方发送消息时,您需要使用不同的方式!

      【讨论】:

      • 我想我可能解释得不好:我已经知道如何制作一个可以接受多个连接并为每个连接提供一个线程来处理的服务器,我想要的是拥有多个通信在同一方向和同一客户端中进行。因此,假设服务器连接到客户端,创建了一个表示连接的线程,但我想要做的是从 2 个不同的通道读取,如果你愿意的话,传输不同类型的数据。例如,我可能希望客户端同时发送两个字符串,而服务器同时读取它们
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 2012-09-17
      相关资源
      最近更新 更多