我有一台客户端机器连接的服务器。最近我决定加密与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
答案 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可能无法解释这种现象。记者自己在评论中承认,最后他最后使用了一个带斜线的网址。