创建包含不同类型对象的哈希集

时间:2014-03-07 18:41:51

标签: java multithreading sockets arraylist hashset

我编写了一个程序(java套接字),其中多线程服务器可以连接到多个客户端。为了与单个客户端通信,服务器程序为每个客户端分配一个DataInputStream和一个DataOutputStream。我想逐个从服务器向客户端广播消息。 每位客户都可以采用不同的方式回复。根据响应,服务器将采取下一步操作。实际上我正在尝试查找哪个客户端包含某个文件。要将消息广播到所有客户端,我将每个客户端的DataOutputStream添加到HashSet中。

private static HashSet<DataOutputStream> comChannels = new HashSet<DataOutputStream>();

我可以遍历HashSet中的项目来向客户端广播任何消息。 然后我从服务器广播我要查找的文件的fileName。当客户端在其目录中找到该文件时,它会发回肯定响应。如果客户端没有该文件,则会发回否定响应。

我面临的问题是我无法得到客户的回复。当我创建客户端线程时,我也为客户端创建了相应的DataInputStream。我尝试创建一个HashSet ArrayList,其中每个ArrayList包含DataOutputStreamDataInputStream一个客户端。

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 DataInputStreamDataOutputStream然后写入所有客户端并阅读所有不同的响应是不可行的。

1 个答案:

答案 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>>更容易。