Как заставить клиентов создавать сокет для каждого другого клиента - PullRequest
1 голос
/ 21 ноября 2011

Мне нужна помощь, чтобы придумать дизайн, где клиенты подключаются и общаются со всеми другими клиентами. Я думаю, что каждому клиенту одновременно потребуется ServerSocket для прослушивания входящих соединений от других клиентов и Socket для инициирования соединений с другими клиентами.

Я тестирую на localhost, поэтому, если я буду использовать номера портов для отслеживания соединений, я столкнусь с таким сценарием:

Socket A (OS assigned port: a) initiates connection with ServerSocket B (known port: 2222)
Both clients record that connection (a, 2222) is made
Socket B (OS assigned port: b) initiates connection with ServerSocket A (known port: 1111)
Both clients record that connection (b, 1111) is made

У нас должно быть 1 соединение на пару клиентов, поэтому вышеприведенное является расточительным. Вот почему я подумываю о настройке локальных портов самостоятельно: сценарий изменится на соединения (1111,2222) и (2222,1111), и, поскольку второй остается тем же, он не сохраняется.

Это звучит разумно?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Почему вам требуется, чтобы клиент установил свой локальный порт? Работа клиентских и серверных сокетов немного отличается.

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

Я думаю, что одна из проблем, которую вы пытаетесь решить, это что, если соединение между двумя клиентами уже установлено? В этом случае обе стороны знают, к кому они подключены, и не будут устанавливать новое соединение. В этом случае вы ищете реализацию собственного протокола двусторонней двусторонней связи.

1 голос
/ 21 ноября 2011

Я новичок с сокетами, так что это может быть просто, но есть какие-нибудь идеи для этого?

A Map<String, Socket> должен выполнить эту работу, где String - это имя хоста удаленного клиента.

Если вам нужны такие функции, как истечение срока действия старых записей, взгляните на класс Guava CacheBuilder. Это создает пользовательскую карту с различным поведением / функциями, которые упрощают реализацию кэшей. (В данном случае кеш соединений)

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