Просто сохраните хэш-карту в памяти некоторого вида идентификатора клиента для объекта java.net.Socket, который представляет сокет этого клиента.Вам нужно придумать способ назначения идентификаторов клиентов, либо предоставленных клиентом, либо предоставленных сервером через некоторую схему авторизации.
Когда приходит сообщение для идентификатора клиента, возьмите сокет с карты и отправьтеэто сообщение.Эта карта должна храниться в объекте синглтонного типа и должна быть правильно синхронизирована.Используйте одновременную хэш-карту.Кроме того, чтение и запись сокетов должны быть синхронизированы, если вы собираетесь использовать многопоточность.
Я опубликовал пример кода в виде github gist .Это немного отличается от того, что я объяснил выше.Я не храню сокеты на карте, я храню клиентские обработчики, которые имеют сокет.Кроме того, чтения сокетов не нуждаются в синхронизации: каждый клиент имеет свой собственный поток, который является единственным потоком, читающим из сокета.Однако записи в сокеты необходимо синхронизировать, поскольку поток отправляющего клиента записывает данные в сокет принимающего клиента.
Возможно, вам лучше использовать что-то вроде JBoss Netty чем кататься самостоятельно.