为什么拒绝连接localhost?

时间:2011-08-28 06:42:10

标签: java url networking localhost stunnel

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

Java代码:

URL url = new URL("http://localhost:8045/malibu/GetProviders");
InputStream stream = url.openStream();

我得到以下内容:

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)
    . . .

如果我尝试使用curl请求同一页面,一切都很好。

什么会导致这种行为?

编辑:是的,有一个侦听套接字 - 正在运行netstat -avn | grep 8045

tcp6       0      0 ::1:8045                :::*                    LISTEN

2 个答案:

答案 0 :(得分:13)

侦听套接字绑定到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地址。

答案 1 :(得分:1)

我在Windows上安装了Apache,并且还拒绝了Java的连接。但是,调试连接和Apache日志显示,实际上不是连接问题。 Apache返回错误301,永久移动。然后它为不存在的端口8080提供重定向URL。因此服务器配置出错了,可能是ServerName指令使用了错误的端口。 向所请求的网址添加尾部斜杠可修复此问题。我的案例中最有用的调试输出是由wget。

给出的

the accepted answer可能无法解释这种现象。记者自己在评论中承认,最后他最后使用了一个带斜线的网址。