为什么拒绝连接localhost?

Rog*_*ach 7 java url networking localhost stunnel

我有一台服务器,客户端机器连接到该服务器.最近我决定加密与stunnel的连接,所以现在客户端程序不是直接连接到服务器,而是连接到localhost:8045(我检查过,这个端口没有被占用).

Java代码:

URL url = new URL("http://localhost:8045/malibu/GetProviders");
InputStream stream = url.openStream();
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:519)
    at java.net.Socket.connect(Socket.java:469)
    at java.net.Socket.<init>(Socket.java:366)
    at java.net.Socket.<init>(Socket.java:180)
    . . .
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用相同的页面curl,一切都很好.

什么可以导致这种行为?

编辑:是的,有一个监听套接字 - 运行netstat -avn | grep 8045给出:

tcp6       0      0 ::1:8045                :::*                    LISTEN
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 14

侦听套接字绑定到IPv6环回地址(:: 1).我记得Java不能正确支持双栈IPv4/IPv6系统的一些问题; 这可能就是这种情况.它仅连接到127.0.0.1(IPv4).

您尝试的其他所有内容(curl,telnet ...)将首先尝试IPv6地址,然后如果失败则返回IPv4地址.这就是他们工作的原因,而Java应用程序却没有.

尝试强制stunnel绑定到127.0.0.1.您也可以尝试使用Java连接http://[::1]:8045/malibu/GetProviders,但我不记得它是否支持HTTP URL中的IPv6地址.

  • 你是如何改变代码使其工作的..也需要帮助 (4认同)