2011-08-28 205 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沒有解釋這種現象。記者自己在評論中承認,最終他最終使用了一個帶斜線的網址。

相關問題