Java Socket 返回 True

3

希望你能帮忙。我对编程比较新,并且正在尝试使用Java套接字。

问题出在以下代码。不知何故,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());

    }
}

非常感谢。

编辑:new Socket(.., ..); 是阻塞的,不是吗?我认为在这种情况下,如果没有异常处理,那么我们就有了一个真正的连接?

编辑:我调整了一下反病毒软件,现在它可以工作了!


2
new Socket(...) 绝对不会返回 true。它会返回一个新的 Socket 对象,如果没有抛出异常的话。 - Joachim Sauer
2个回答

3

几天前我在公司电脑上遇到了完全相同的情况,花了好几个小时才找到解决方法。

检查你的杀毒软件,有些杀毒软件(比如E*** N**32)使用实时TCP扫描,这样即使目标端口上没有任何监听,连接也会成功,但当你尝试从套接字读取/写入数据时,它会稍后重置连接。

将以下代码添加到你的程序中:

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

如果您现在遇到SocketException异常,您应该考虑更换您的防病毒软件。

另外,您可以在创建套接字后,在应用程序中设置断点,然后使用netstat -ano(在Windows上)检查与套接字的另一个端点相关联的进程ID(如果连接到localhost,则应该在您的计算机上)。

我建议您禁用您的防病毒软件,但在某些情况下,即使这样也无法卸载其损坏的实时TCP扫描驱动程序...


commSocket.getInputStream().write(0); 不起作用。我找不到 write 方法。 - iTEgg
太棒了!我刚刚将我的防病毒软件切换到普通模式,现在它可以正常工作了!真是个好提示! - iTEgg
1
@ikurtz 使用输出流进行写入操作,使用输入流进行读取操作。 :-) - corsiKa

1

Socket构造函数会立即连接并在连接失败时抛出IOException异常。因此,显然您已成功连接到服务器(这可能是您自己没有创建的服务器)。


我正在本地机器上使用本地IP进行测试,所以没有运行任何服务器。奇怪吗? - iTEgg
如果您正在使用本地IP,则可能将其用作服务器。 - Anthony Forloney
如何在没有运行服务器的情况下获取连接? - iTEgg
1
更精确地说,您将在该特定情况下获得“ConnectException”(它是“IOException”的子类)。测试该异常并向用户提供明智的错误消息是个好主意。 - mihi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接