我编写了一个程序(java套接字),其中多线程服务器可以连接到多个客户端。为了与单个客户端通信,服务器程序为每个客户端分配一个DataInputStream
和一个DataOutputStream
。我想逐个从服务器向客户端广播消息。 每位客户都可以采用不同的方式回复。根据响应,服务器将采取下一步操作。实际上我正在尝试查找哪个客户端包含某个文件。要将消息广播到所有客户端,我将每个客户端的DataOutputStream
添加到HashSet中。
private static HashSet<DataOutputStream> comChannels = new HashSet<DataOutputStream>();
我可以遍历HashSet中的项目来向客户端广播任何消息。 然后我从服务器广播我要查找的文件的fileName。当客户端在其目录中找到该文件时,它会发回肯定响应。如果客户端没有该文件,则会发回否定响应。
我面临的问题是我无法得到客户的回复。当我创建客户端线程时,我也为客户端创建了相应的DataInputStream
。我尝试创建一个HashSet
ArrayList
,其中每个ArrayList
包含DataOutputStream
和DataInputStream
一个客户端。
HashSet<ArrayList<Object>> comChannels = new HashSet<ArrayList<Object>>();
然后,每次创建新的客户端线程时,我都会创建一个包含客户端输入和输出流的ArrayList
,然后我将其添加到HashSet
ArrayList
。我想我可以遍历HashSet
,它会在每次迭代中返回ArrayList
。然后我可以选择列表的第一个对象,那将是我的输出流,第二个对象将是我的输入流。但这不起作用。
for (ArrayList<Object> client : comChannels) {
//select outputstream from the Arraylist and write message to client
//select inputstream from the Arraylist and read response from client
}
如何通过某种方式广播和获取客户回复?我可以确定哪个响应来自哪个客户端?请注意,我希望一次将消息发送给一个客户端,并在收到肯定响应后立即终止该程序。这使我免于不必要地向所有客户端发送消息。因此,创建单独的HashSets
DataInputStream
和DataOutputStream
然后写入所有客户端并阅读所有不同的响应是不可行的。
答案 0 :(得分:1)
表示客户端的一对流是应用程序中的域概念,应该可以在有意义的类中捕获。这样的事情至少是这样的:
public class Client {
public DataOutputStream outStream;
public DataInputStream inStream;
public Client(DataOutputStream out, DataInputStream in) {
this.outStream = out;
this.inStream = in;
}
}
每当您为客户端创建流时,都会将它们粘贴到此Client
类的实例中。然后,您可以将Client
个对象放在List
中并迭代您想要的所有内容。
for (Client client : clientList) {
// do whatever you want with client.outStream and client.inStream
}
现在你最终得到的是List<Client>
,这对于一个人来说比HashSet<ArrayList<Object>>
更容易。