gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:18:29 24 4
gpt4 key购买 nike

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

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

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

我面临的问题是我无法得到客户的回复。当我创建客户端线程时,我创建了相应的 DataInputStream对于客户也是如此。我试图创建一个 HashSetArrayList其中每个 ArrayList包含DataOutputStreamDataInputStream对于一个单一客户。

HashSet<ArrayList<Object>> comChannels = new HashSet<ArrayList<Object>>();

然后我创建一个 ArrayList每次创建新的客户端线程时包含客户端的输入和输出流,然后将其添加到 HashSetArrayList s。我想我可以迭代 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
}

如何广播并获取客户端的回复,以便能够识别哪个响应来自哪个客户端?请注意,我想一次将消息发送给一个客户端,并在收到积极响应后立即终止程序。这使我不必向所有客户端发送消息。因此创建单独的 HashSetsDataInputStreamDataOutputStream然后写入所有客户端并读取所有不同的响应是不可行的。

最佳答案

代表客户端的一对流是应用程序中的域概念,应该在有意义的类中捕获。至少是这样的:

public class Client {
public DataOutputStream outStream;
public DataInputStream inStream;

public Client(DataOutputStream out, DataInputStream in) {
this.outStream = out;
this.inStream = in;
}
}

每当您为客户端创建流时,请将它们粘贴到此 Client 的实例中类(class)。然后你可以输入 Client List 中的对象并迭代你想要的一切。

for (Client client : clientList) {
// do whatever you want with client.outStream and client.inStream
}

现在你最终得到 List<Client> ,这比 HashSet<ArrayList<Object>> 更容易让人理解。 .

关于java - 创建包含不同类型对象的哈希集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com