2017-04-08 75 views
1

我基本上要实现这一点:如何使2个服务器线程与2个客户端线程通信?

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

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

当ServerThreadA写东西流仅ClientThreadA应读它,而不是ClientThreadB。以同样的方式,我不希望ClientThreadB读取ServerThreadA写入的内容。

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

编辑:
我想我可能没有解释清楚:我已经知道如何做,可以接受多个连接,并给他们每人一个线程工作的服务器,有什么我想是有多个通信在同一个方向和同一个客户端上进行。假设服务器连接到一个客户端,创建一个代表连接的线程,但是我想要从两个不同的通道读取数据,如果你愿意的话,可以传输不同类型的数据。例如,我可能希望客户端同时发送两个字符串,服务器同时读取它们

回答

2

变化协议,使得每个字符串之前的数应写入:0,如果该消息是用于ClientThreadA,如果消息是ClientThreadB,则为1。

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

0

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

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

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

的一点是:在服务器代码等待上一个服务器插座;当一个新客户进来时,accept()给你一个“专用”套接字与该客户进行通话。

换句话说:无论客户端线程多少连接到服务器;并且不管有多少服务器线程关心他们;总有一个特定套接字客户端。

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

而当您考虑“共享”套接字以允许一方发送消息到全部对方在另一边,那么您需要使用不同的方式!

+0

我想我可能解释得不好:我已经知道如何制作一个服务器,可以接受多个连接,并给他们每个人一个线程工作,我试图是有多个通信进行同一个方向,并在同一个客户端。假设服务器连接到一个客户端,创建一个代表连接的线程,但是我想要从两个不同的通道读取数据,如果你愿意的话,可以传输不同类型的数据。例如,我可能希望客户端同时发送两个字符串,并且服务器同时读取它们* –

1

在服务器接受端口号这是由客户端传递或者叫您可以使用的ServerSocket服务器。

两者都使用相同端口号用于通信。

许多客户的数量可以调用服务器。作为客户端请求的服务器(即端口号)接受客户机请求这意味着客户端加入到服务器....

+1

我想我可能解释得不好:我已经知道如何创建一个可以接受多个连接并给每个连接的服务器他们是一个工作线程,我试图让多个通信在同一个方向和同一个客户端上进行。假设服务器连接到一个客户端,创建一个代表连接的线程,但是我想要从两个不同的通道读取数据,如果你愿意的话,可以传输不同类型的数据。例如,我可能希望客户端同时发送两个字符串,并且服务器同时读取它们* –

+1

您的意思是两个不同的客户端将两个不同的数据发送到单个服务器,并且服务器同时接受两个数据。 –

+1

不,每个客户端都会向服务器发送两个不同的数据。问题是,它必须同时使用多线程 –

相关问题