Как разработать мульти-клиент / серверное приложение? - PullRequest
2 голосов
/ 29 августа 2011

В приложении на основе сокетов (клиент / сервер) я хочу, чтобы сервер работал как прокси (менеджер) для обработки нескольких клиентов, а также для получения сообщения от одного клиента и его отправки клиенту, идентифицированному как удостоверение личности

Как узнать, какой клиент работает в другом потоке, как получить сокет ассоциированного клиента, который представляет идентификатор?

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Просто сохраните хэш-карту в памяти некоторого вида идентификатора клиента для объекта java.net.Socket, который представляет сокет этого клиента.Вам нужно придумать способ назначения идентификаторов клиентов, либо предоставленных клиентом, либо предоставленных сервером через некоторую схему авторизации.

Когда приходит сообщение для идентификатора клиента, возьмите сокет с карты и отправьтеэто сообщение.Эта карта должна храниться в объекте синглтонного типа и должна быть правильно синхронизирована.Используйте одновременную хэш-карту.Кроме того, чтение и запись сокетов должны быть синхронизированы, если вы собираетесь использовать многопоточность.

Я опубликовал пример кода в виде github gist .Это немного отличается от того, что я объяснил выше.Я не храню сокеты на карте, я храню клиентские обработчики, которые имеют сокет.Кроме того, чтения сокетов не нуждаются в синхронизации: каждый клиент имеет свой собственный поток, который является единственным потоком, читающим из сокета.Однако записи в сокеты необходимо синхронизировать, поскольку поток отправляющего клиента записывает данные в сокет принимающего клиента.

Возможно, вам лучше использовать что-то вроде JBoss Netty чем кататься самостоятельно.

1 голос
/ 29 августа 2011

вы можете хранить много информации об идентификаторе, поэтому каждый раз, когда он подключается, вы получаете как ip и сохраняете поток, на котором он работает, а затем вы используете как hashmap, чтобы связать id со всей этой информацией, тогда вы можете легко получитьпоток, в котором он запущен, и отправка информации нужному клиенту

0 голосов
/ 29 августа 2011

Сохраните сообщения, подлежащие доставке, в базу данных, и заставьте ваши потоки проверять базу данных на наличие новых сообщений, которые будут регулярно доставляться «их» клиентам.

Если вам не нужна выделенная база данных для сообщений, создайте плоский файл с простыми сопоставлениями ClientID-> Socket и используйте его как поисковую систему типа «телефонной книги». В зависимости от количества клиентов, которые вы планируете добавить, каждый поток может предварительно и регулярно перезагружать такой файл в свою память для более быстрого доступа ...

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