2015-02-10 3 views
1

Я занимаюсь простым упражнением для понимания сокетов и серверных сокетов. При myServerSocket = new ServerSocket(0) порт случайно назначается гнезду. Я хочу знать, как я могу настроить клиент для подключения к этому порту. Как клиент находит порт прослушивания, если он случайно назначен?Назначение порта Java Client/Server

Вот это фрагменты кода из обоих серверов и клиентских классов:

Сервер:

public static void main(String[] args) { 

    try { 
     // First we create a server socket and bind it to a random port. 
     ServerSocket myServerSocket = new ServerSocket(0); 


     // wait for an incoming connection... 
     System.out.println("Server is waiting for an incoming connection on host=" 
       + InetAddress.getLocalHost().getCanonicalHostName() 
       + " port=" + myServerSocket.getLocalPort()); 
     Socket skt = myServerSocket.accept(); 

Клиент:

public static void main(String[] args) { 

    // create a socket and bind it to the host/port server is listening on. 
    String host; 
    int port; 

    if(args.length==0) { 
     host = "localhost"; 
     port = 9999;   
    } else { 
     host = args[0]; 
     String portStr = args[1]; 
     try { 
      port = Integer.parseInt(portStr); 
     } catch (NumberFormatException nfe) { 
      System.out.println("Whoops, invalid port number. Will default to 9999"); 
      port = 9999; 
     } 
    } 
+2

Клиент должен знать точный номер порта, где сервер слушает –

+0

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

ответ

2

Клиент имеет три варианта найдите порт прослушивания: сканирование портов, ввод пользователя или общий каталог.

Сканирование портов

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

Ввод данных пользователем

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

Shared Каталог

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

+1

Кроме того, в локальной сети вы можете использовать UDP для трансляции вашей доступности. –

1

Обычная процедура для сервера - использовать порт сокета, о котором знают все клиенты. Вот почему есть списки известных портов, так что известные серверы, такие как веб-серверы, ftp-серверы, серверы telnet и т. Д., Имеют стандартные порты, которые они используют. Клиенты, желающие подключиться к этим серверам, используют известный порт в качестве части запроса на соединение.

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

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

Если вы решили выбрать порт, вы должны использовать порт, отличный от одного из известных портов, например, приведенного в этом Wikipedia list of well known ports.

Публикация номера порта означает, что вам потребуется какой-то способ для клиентов открыть порт, который вы используете для своего сервера. Существует несколько разных подходов к этому, однако все они разделяют способность клиента запрашивать известное устройство или сервер каким-либо известным способом. У вас может быть какой-то сервер, который предоставляет каталог поиска серверов, поэтому клиент будет запрашивать порт для использования с сервера, например, Service Name and Transport Lookup Service.

Смежные вопросы