Java Hashtable - Как получить любую запись - PullRequest
2 голосов
/ 31 декабря 2011

Я работаю на сервере чата и помещаю клиентов в Hashtable. Этот Hashtable составлен из <String name, Connection c>,, где Connection имеет Socket и входящие потоки.

Я могу отправлять сообщения, просто ища ник в Hashtable, но как я могу отправить его всем людям?

Могу ли я "разведчик" (это был неизвестный термин) каждую запись в Hashtable? (как и массив, я хочу «SCOUT» для каждой записи, поэтому я сделаю цикл и отправлю сообщение всем).

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 31 декабря 2011

Вы можете ответить на свой вопрос, прочитав javadocs для HashMap.«Прочитайте javadocs» - это важный урок , который каждый новичок в Java должен выучить и запомнить .

В этом случае javadocs покажет вам 3 метода, которые могутбыть полезным:

  • Метод keys() возвращает коллекцию, состоящую из ключей в таблице.
  • Метод values() возвращает коллекцию, состоящую из значений в таблице.
  • Метод entries() возвращает коллекцию, представляющую пары ключ / значение в таблице.

Вы можете повторять эти коллекции как любую другую коллекцию.В других ответах есть примеры.


Однако создается впечатление, что ваше приложение является многопоточным.Если это так, то есть две другие проблемы, с которыми вам нужно разобраться, чтобы сделать вашу программу надежной:

  1. Если два или более потоков могут использовать один и тот же объект или структуру данных, онинеобходимо предпринять необходимые шаги, чтобы обеспечить их правильную синхронизацию.Если они этого не делают, то существует ненулевая вероятность того, что некоторая последовательность операций приведет к переводу структуры данных в несогласованное состояние или что один или несколько потоков будут см. несогласованное состояние (из-за кэшей памяти, значений, сохраненных в регистрах и т. д.).

  2. Если один поток использует один из итераторов коллекции HashMap, а другой добавляет или удаляет запись, топервая может получить ConcurrentModificationException.

  3. Если вы решите две вышеуказанные проблемы, заблокировав все остальные операции на HashMap во время операции «отправить всем»происходит, вы непреднамеренно создаете узкое место в производительности.По сути, все остальное останавливается до завершения операции.Вы получите аналогичный эффект (но в более мелком масштабе), если просто поместите оболочку синхронизации вокруг HashMap.

Вам необходимо прочитать и узнать об этих вещах.(И это слишком много, чтобы объяснить в одном ответе SO).Простое (но не универсальное) решение всех 3 проблем, которое , вероятно, будет работать в вашем случае, если использовать ConcurrentHashMap вместо простого HashMap.

3 голосов
/ 31 декабря 2011

Я могу отправлять сообщения, просто ища ник в Hashtable, но как я могу отправить его всем людям?

Затем сделайте то же самое для всех псевдонимов в хеш-таблице:

for (String name : yourTable.keySet())
    yourTable.get(name).send("your message");

или, альтернативно:

for (Connection conn : yourTable.values())
    conn.send("your message");
1 голос
/ 31 декабря 2011

Вы можете перебрать все значения в Hashtable и сделать то, что вы хотите для всех них:

Map<String, Connection> users;
for (Connection connection : users.values()) {
    // Send the message to each Socket here.
}
0 голосов
/ 31 декабря 2011

В Hashtable есть keySet (), который возвращает все ключевые записи в этой таблице. Я публикую это с мобильного, не могу получить пример ссылки. Если вам нужен весь список соединений, вы можете использовать entrySet ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...