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

时间:2017-04-08 18:19:43

标签: java multithreading sockets inputstream outputstream

我基本上想要实现这个目标:

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

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

当ServerThreadA向流写入内容时,ClientThreadA只读取它,而不是ClientThreadB。以同样的方式,我不希望ClientThreadB读取ServerThreadA编写的内容。

有什么方法可以实现这个目标吗?

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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

重点是:服务器代码等待一个服务器套接字;当一个新客户进来时,accept()会给你一个专门的&#34;套接字与该客户交谈。

换句话说:无论有多少客户端线程连接到您的服务器;无论有多少服务器线程照顾它们;每个客户端始终有一个特定套接字

没有插座共享;因此,无需担心可能发送给多个客户的消息!

当你想到&#34;分享&#34;套接字允许一方向另一方的所有对等方发送消息,然后你需要使用不同的方式!