Сокет Java возвращает True - PullRequest
3 голосов
/ 10 мая 2010

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

Проблема в коде ниже. по какой-то причине 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());

    }
}

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

РЕДАКТИРОВАТЬ: новый сокет (.., ..); блокировка не так ли? я думал в этом случае, если это было обработано без исключений, то у нас есть истинное соединение?

РЕДАКТИРОВАТЬ: я играл с антивирусом, и теперь он работает!

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

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

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

Добавьте это к своему коду:

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

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

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

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

1 голос
/ 10 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...