我在聊天服务器上工作,并且我将客户端放入Hashtable。
此Hashtable由<String name, Connection c>,
Connection
具有Socket
和进出流量组成。
我可以发送消息,只是在Hashtable中寻找昵称,但我怎样才能将其发送给所有人?
我可以&#34; Scout&#34; (这是一个未知的术语)每个Hashtable的条目? (就像一个数组,我想&#34; SCOUT&#34;每个条目,所以我会做一个循环,我会把这个消息发送给每个人)。
提前致谢。
答案 0 :(得分:4)
您可以阅读javadocs for HashMap
来回答您自己的问题。 “阅读javadocs”是重要的一课,每个Java初学者都应该学习并记住。
在这种情况下,javadocs将向您展示3种可能有用的方法:
keys()
方法返回一个由表中的键组成的集合。values()
方法返回一个由表中的值组成的集合。entries()
方法返回表示表中键/值对的集合。您可以像其他任何集合一样迭代这些集合。其他答案中有一些例子。
但是,我觉得您的应用程序是多线程的。如果是这种情况,您需要处理两个其他问题,以使您的程序可靠:
如果两个或多个线程可以使用相同的对象或数据结构,则需要采取必要的步骤以确保它们正确同步。如果他们没有那么非零概率,某些操作序列将导致数据结构进入不一致状态,或者一个或多个线程将看到< / em>一个不一致的状态(由于内存缓存,寄存器中保存的值等)。
如果一个线程正在使用HashMap的一个集合迭代器而另一个线程添加或删除一个条目,那么第一个线程可能会获得ConcurrentModificationException
。
如果通过在“发送到所有”操作进行时锁定HashMap
上的所有其他操作来解决上述两个问题,则会无意中造成性能瓶颈。基本上,其他一切都会停止,直到操作完成。如果你只是在HashMap
周围放置一个同步包装器,你会得到类似的效果(但是更精细)。
您需要阅读并了解这些事情。 (并且在单个SO答案中解释得太多了)。对于可能的所有3个问题的简单(但不是通用)解决方案将在您的用例中使用它使用ConcurrentHashMap
而不是普通HashMap
。
答案 1 :(得分:3)
我可以发送消息,只是在Hashtable中查找昵称,但我该如何将其发送给所有人?
然后对哈希表中的所有昵称执行相同的操作:
for (String name : yourTable.keySet())
yourTable.get(name).send("your message");
或者,或者:
for (Connection conn : yourTable.values())
conn.send("your message");
答案 2 :(得分:1)
您可以遍历Hashtable中的所有值,并按照您希望的方式执行所有值:
Map<String, Connection> users;
for (Connection connection : users.values()) {
// Send the message to each Socket here.
}
答案 3 :(得分:0)
Hashtable具有keySet(),它返回该表中的所有键条目。我是从手机发布的,无法得到你的示例链接。如果您想要所有连接列表,可以使用entrySet()。