Как соединить два сокета в одноранговой настройке - PullRequest
0 голосов
/ 19 октября 2011

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

Основные настройки следующие: Я рассчитываю на настройку сервера с программой, которая прослушивает порт XYZ. У меня было бы два примера пользователей (A и B). Пользователь "A" хочет поделиться файлом с пользователем "B". «А» идет к своему локальному клиенту и отправляет некоторую информацию на сервер. Он возвращает ключ, который он может отправить пользователю "B", как ему нравится (вместо публикации или трансляции местоположения). Пользователь «Б» получает ключ, кладет его в своего клиента. Его клиент идет на сервер и получает информацию о том, как подключиться к компьютеру пользователя «А» для передачи файла.

Теперь, это достаточно просто для машин, которые могут подключаться через сокет напрямую, но я предполагаю, что пользователи A и B находятся в совершенно разных сетях, за разными публичными IP-адресами (обычные интернет-пользователи). Итак, что меня удивило, могу ли я, чтобы пользователь «A» и пользователь «B» отслеживали состояние на сервере, и когда стало очевидно, что пришло время поделиться файлом, используйте сервер в качестве моста, чтобы каким-то образом соединить их… передать рукопожатие и затем либо новый сокет, либо как-то соединить сокеты, подключенные к серверу? Предостережение во всем этом состоит в том, что я бы хотел, чтобы полоса пропускания не передавалась по серверу (или я мог бы просто инициировать прямые подключения к серверу), а напрямую взаимодействовала между двумя компьютерами, используя сервер только для согласования. соединение.

Но я понятия не имею, где искать информацию об этом, или, если это возможно:)

Я предпочитаю использовать Java.

1 Ответ

1 голос
/ 19 октября 2011

Чтобы напрямую соединить два сокета, не используя сервер в качестве брокера, нужно иметь возможность прямого удара в качестве конечной точки.

Я не могу представить ни одного объекта, который мог бы согласовать двасоединения за NAT или PAT, а затем выпадают из цикла, оставляя два других подключенными.

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

...