2011-04-17 3 views
5

Я пытаюсь подключиться к серверу с помощью сокета Java. Я пытаюсь соединиться от порта 80 до 90Блоки Java-сокетов при подключении к серверу

int port; 
Socket clientsocket; 
String hostname = "www.google.com"; 

for(port = 80;port<=90; port++){ 
    try{ 
    clientsocket = new Socket(hostname,port); 
    System.out.println("Connection at port " + port + "\t" + clientsocket.isConnected()); 
    clientsocket.close(); 
    } 
    catch(Exception e){ 
    System.out.println(e.getMessage()); 
    } 
} 

Когда я пытаюсь подключиться к любой веб-сайт, как google.com или w3schools.com моя программа висит на socket() призыв к номерам портов за исключением 80. Поскольку эти веб-сайты не работают на портах 81-90, он должен вызывать исключение, но вместо этого он блокируется. Для порта 80 он работает нормально. Когда я пытаюсь подключиться к серверу apache, установленному на моей машине, он не блокирует ни одного номера порта и дает мне отказ от отказа Connection, который является очевидным поведением. Так почему это происходит. Заранее спасибо.

+0

Аналогичная проблема http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4232651 – Durin

+0

Не ваш код, даже telnet www.google.com 81 раз. – lobster1234

+0

@ lobster1234: спасибо за ответ. Код, который я написал выше, - это мой код. Ссылка на ошибку, конечно, не моя. – Durin

ответ

13

Когда я пытаюсь подключиться к любой веб-сайт, как google.com или w3schools.com моя программа зависает на вызов сокета() для номеров портов, кроме 80. Так как эти сайты не служат в портах 81-90 он должен но исключение блокируется.

Это почти наверняка не делает Java.

Когда вы вызываете конструктор Socket(String, int), JVM просит ОС попытаться установить соединение с IP-адресом, соответствующим указанному имени, используя номер порта, который вы выбрали. Если предположить, что мы говорим TCP/IP, ОС отсылает сообщение TCP-SYN «», и ждет ответа:

  • Если ответ является «SYN-ACK», он приступает к созданию координационного центра соединение согласно протоколу; см. http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment.

  • Если ответ является «RST» (сброс), соединение завершается с ошибкой, и это приводит к исключению «отказа в соединении» Java. (Обычно это происходит, если «SYN» отправляется на удаленный сервер, только чтобы обнаружить, что приложение не прослушивает порт, к которому вы пытались подключиться.)

  • Если ответ является ICMP (например, назначение ICMP недоступно), это обычно приводит к немедленному сбою запроса на соединение и исключению Java.

  • Если ответа нет, ОС будет пытаться снова, и снова, и снова. В зависимости от тайм-аута подключения по умолчанию Java (или явного тайм-аута) этот процесс может продолжаться в течение длительного времени.

Так что, скорее всего, происходит то, что что-то фильтрует сообщения «SYN» на фанк-портах и ​​просто отбрасывает их. Это может быть локальное программное обеспечение брандмауэра на вашем ПК, программное обеспечение брандмауэра на вашем шлюзе или сеть вашего интернет-провайдера или программное обеспечение в удаленной системе, с которой вы пытаетесь поговорить. Или это может случиться с сообщением «SYN-ACK».

В любом случае поведение блокировки/тайм-аута присуще сети TCP/IP, и невозможно точно диагностировать уровень ОС или Java. Вам просто нужно скорректировать свои ожидания. (Или установите более короткий тайм-аут подключения ...)

+0

было так красиво написано и просвещено. Спасибо тонне. – Durin

+0

Общей причиной может быть прокси. – tkruse

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