Соединение двух клиентов в сети - PullRequest
3 голосов
/ 25 марта 2011

Если у меня есть два клиента, которые знают друг о друге (то есть знают, какие порты использовать, и их соответствующие имена хостов), могут ли они подключаться друг к другу с помощью сокетов?

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

Я также использую Java, поэтому я думаю об использовании двух экземпляров Socket на обоих клиентах, а не ServerSocket на одном иРазъем на другой.

Ответы [ 6 ]

2 голосов
/ 25 марта 2011

Кто-то должен где-то прослушивать соединение. Стандартное соединение Socket подключается к хосту и порту, на котором находится активный прослушиватель (ServerSocket для стандартного сокета Java). По умолчанию ServerSocket блокирует ожидание входящих соединений.

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

Вы также можете взглянуть на вещание, однако с этим решением также есть сложности.

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

1 голос
/ 25 марта 2011

Вы можете создать ServerSocket, принять подключение.Это добавляет одну строку кода по сравнению с простым созданием сокета, так что это не требует больших затрат кода.

На стороне клиента

Socket s = new Socket(hostname, port);

на стороне сервера

ServerSocket ss = new ServerSocket(port); // can be reused.

Socket s = ss.accept();

Поскольку вам нужно только одно соединение, это может быть не сложнее, чем это.

1 голос
/ 25 марта 2011

Нет, они могут сделать это только путем инициализации серверного сокета хотя бы в одной из сторон.После того, как один из клиентов установит соединение, вы можете реализовать протокол для записи / чтения с обеих сторон.Это механизм «ожидания» соединений, клиентские сокеты не могут получить соединение, если оно не было инициировано серверным сокетом вначале.

Идея, почему бы вам не интегрировать небольшой HTTP-сервер вклиенты, чтобы вы знали, что вы можете придерживаться протокола HTTP (то есть: Jetty )

0 голосов
/ 25 марта 2011

Вы можете использовать протокол UDP без установления соединения вместо TCP, если надежная доставка сообщений не имеет значения.

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

0 голосов
/ 25 марта 2011

Проще говоря, ответ - нет, вы не можете использовать оба конца в качестве клиентов. Нет команды это позволяет двум разъемам соединяться друг с другом.

Единственный способ создать соединение с помощью API сокетов - одна сторона прослушивает соединения и принимает их, а другая - подключается к нему.

Обычное решение ситуации - произвольно решить, что один конец - это сервер, а другой - клиент. Вы слушаете на стороне сервера и подключаетесь на стороне клиента.

0 голосов
/ 25 марта 2011

Нет, вам нужен ServerSocket для прослушивания порта и принятия соединения.

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