2010-05-10 2 views
3

Надеюсь, вы сможете помочь. Я довольно новичок в программировании, и я играю с java Sockets.Java Socket Returns True

Проблема заключается в следующем. по какой-то причине commSocket = new Socket(hostName, portNumber); возвращает true, даже если он не подключен к серверу (сервер еще не реализован!). Любые идеи относительно этой ситуации?

Для hostName Я передаю свой IP-адрес локальной сети и порт для порта, выбранного вручную.

public void networkConnect(String hostName, int portNumber){ 

    try { 
     networkConnected = false; 
     netMessage = "Attempting Connection"; 
     NetworkMessage networkMessage = new NetworkMessage(networkConnected, netMessage); 

     commSocket = new Socket(hostName, portNumber); 

     // this returns true!! 
     System.out.println(commSocket.isConnected()); 

     networkConnected = true; 
     netMessage = "Connected: "; 


     System.out.println("hellooo"); 

    } catch (UnknownHostException e){ 
     System.out.println(e.getMessage()); 

    } catch (IOException e){ 
     System.out.println(e.getMessage()); 

    } 
} 

Большое спасибо.

EDIT: новый Socket (.., ..); блокирует, не так ли? я думал, что в этом случае, если это было обработано без исключений, то у нас есть истинная связь?

EDIT: Я играл с антивирусом, и теперь он работает!

+2

'нового гнезда (...)' ** определенно ** не возвращает 'true'. Он возвращает новый объект 'Socket', если он не генерирует исключение. –

ответ

3

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

Проверьте свой антивирус, некоторые антивирусы (например, E*** N**32) используют прямое TCP-сканирование, которое делает соединение успешным, даже если ничего не прослушивает на целевом порту, но сбрасывает его позже, когда вы пытаетесь прочитать/записать из сокета.

Добавьте это в ваш код:

commSocket.getOutputStream().write(0); 
commSocket.getInputStream().read(); 

Если вы получаете SocketException сейчас, вы действительно должны рассмотреть, чтобы изменить свой антивирус.

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

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

+0

commSocket.getInputStream(). Write (0); не работает. Я не мог найти метод записи. – iTEgg

+0

Супер! Я просто переключил свой антивирус на игру больше в нормальный режим, и теперь он работает! Отличный совет! – iTEgg

+1

@ikurtz использовать запись в выходном потоке и читать на входном потоке. :-) – corsiKa

1

Socket constructor подключается сразу же и выдает IOException, если это не удается. По-видимому, вы успешно подключились к серверу (это может быть тот, который вы не делали сами).

+0

Ну, я тестирую его на локальной машине с локальным IP-адресом. поэтому нет серверов. странно? – iTEgg

+0

Если вы используете свой локальный IP-адрес, он может использовать это как ваш сервер. –

+0

получить соединение без запуска сервера? – iTEgg