2014-12-10 5 views
1

Я пытаюсь создать простую программу обмена сообщениями в java, которая может работать до тех пор, пока вы подключены к Интернету. Для этого мне нужно сделать ServerSocket для получения сообщения. Но для создания ServerSocket мне нужно назначить его порту. Если я назначу ему определенный порт, такой как 25504, как клиент будет подключаться к этому серверу без необходимости пересылать этот порт? И если я использую ServerSocket (0), чтобы найти свободный порт, как клиент узнает, какой порт он нашел без сервера, отправляющего клиенту порт? Я хочу, чтобы эту программу можно было использовать без переадресации, чтобы вы могли использовать ее в общественных местах.Соедините разъем с разъемом SeverSocket (0) без переадресации портов?

ответ

1

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

Однако, если вы используете серверный сокет и работаете за сетевым маршрутизатором, вам необходимо настроить перенаправление портов, этого не избежать. Однако многие маршрутизаторы поддерживают uPNP, который (среди прочего) может позволить приложению динамически открывать/закрывать порты пересылки на маршрутизаторе.

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

+0

Как настроить клиентский сокет для приема данных? – hedfun2

+0

Вы просто подключаете клиентский сокет к серверу, а затем начинаете чтение с клиентского сокета либо в цикле, и в таймере, либо в потоке. Это так просто. Нормальная работа заключается в том, что чтение блокирует вызывающий поток до тех пор, пока данные не поступят. Или вы можете периодически проверять метод сокета 'InputStream.available()' перед чтением, если вам нужно делать другие вещи тем временем. –