8

我有一台服务器,客户端机器连接到该服务器。最近我决定用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
4

2 回答 2

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 地址。

于 2011-08-28T07:03:26.917 回答
1

我在 Windows 上有 Apache,并且 Java 也拒绝连接。但是调试连接和 Apache 日志显示,这实际上不是连接问题。Apache 返回错误 301,永久移动。然后它提供了一个重定向 url 到不存在的端口 8080。所以服务器配置有问题,可能是 ServerName 指令使用了错误的端口。在请求的 url 中添加斜杠可以解决问题。在我的例子中,最有用的调试输出是由 wget 提供的。

接受的答案可能无法解释这种现象。记者本人在评论中承认,最后他使用了一个带有斜线的网址。

于 2013-11-25T16:54:24.017 回答