2011-08-28 207 views
6

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

您是否尝试过https://在URL中() –

+2

@Dave:(1)这不是stunnel的工作原理。 (2)错误显然是TCP级别的连接拒绝,而不是应用程序级别的协商错误。 – cdhowie

+0

尝试在URL中使用您的IP。 – nIKUNJ

回答

11

监听套接字绑定到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

是的!它工作!我将stunnel.conf中的“accept”行更改为127.0.0.1:8045,将URL改为“http: //127.0.0.1:8045/malibu/“,一切似乎都没有问题。 – Rogach

+4

你是如何改变代码以使其工作的......需要帮助 –

1

我在Windows上有Apache,而且连接拒绝来自Java。但是,调试连接和Apache日志显示,它实际上是而不是连接问题。 Apache返回错误301,永久移动。然后它将重定向url提供给不存在的端口8080.因此,服务器配置出现问题,可能ServerName指令使用错误的端口。 向请求的url添加尾部斜杠可修复问题。在我的情况下,最有用的调试输出是由wget给出的。

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

相关问题