2014-09-20 64 views
10

我知道有關於這個主題的幾個問題但我沒有找到任何一個答案。爪哇HttpUrlConnection拋出拒絕連接

我想打開一個連接到我的本地服務器,但我一直在拒絕連接。

我有服務器正在運行,我測試了與瀏覽器和名爲Postman的谷歌應用程序的連接,它可以工作。

打開連接時發生故障,好像沒有連接。或者可能是阻塞了連接?我測試了防火牆和防病毒軟件,沒有運氣。在郵差

測試網址如果我取代「http://www.google.com」它工作正常的URL會返回一個用戶,因爲它應該...

這裏是我的代碼:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

/** 
* 
* @author Gabriel 
*/ 
public class HttpConnection { 

    public HttpConnection() { 

    } 

    public void makeRequest() throws MalformedURLException, IOException { 

     String url = "http://localhost:8000/users/1"; 

    URL obj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
    // optional default is GET 
    con.setRequestMethod("GET"); 

    //add request header 
    con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36"); 
     con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
     con.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch"); 
     con.setRequestProperty("Accept-Language", "en-US,en;q=0.8,es;q=0.6"); 
     con.setRequestProperty("Connection", "keep-alive"); 
     con.setRequestProperty("Host", "localhost:8000"); 

    int responseCode = con.getResponseCode(); 
    System.out.println("\nSending 'GET' request to URL : " + url); 
    System.out.println("Response Code : " + responseCode); 

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
    } 
    in.close(); 

    //print result 
    System.out.println(response.toString()); 


    } 
} 
+1

和瀏覽器是你正在運行的Java在同一臺計算機上? – 2014-09-20 01:47:42

+0

是的...我的猜測是,有些東西阻止Java打開本地連接:P – 2014-09-20 02:03:15

+0

好吧,我試過只是連接到http:// localhost,它的工作原理是,問題是http:// localhost:8000 :p我不知道爲什麼 – 2014-09-20 02:19:36

回答

2

我會做出瘋狂猜測可能是問題。這可能是IPv4/IPv6問題。

如果是這樣,這裏是兩個可能的解決方案

  • 如果服務器僅在IPv6地址聽,將其更改爲聽的IPv4。
  • 如果服務器偵聽的IPv4,然後迫使Java來使用IPv4與 java.net.preferIPv4Stack=true
+0

試過,但它沒有工作。我的網址類似於「http:// my-host-name:51234/abc」。它從瀏覽器工作,但現在從Java HttpUrlconnection。 – 2016-03-15 20:25:17

+0

如果我將其更改爲「http:// locahost:8080/abc」,它可以從java代碼中運行。不知道爲什麼使用「我的主機名」不適合我。 – 2016-03-15 20:58:19

+0

好的,當你有實際的IP而不是主機名'my-host-name'時,工作是否正常?如果確實如此,則將主機名轉換爲IP即DNS問題是一個問題。 – gustf 2016-03-15 21:05:41

0

那麼,在你的網頁瀏覽器把http://localhost:8000/users/1您怎麼弄?一個簡單的Connection Refused錯誤。這不是你,它是網站。此外,Url使用Protocol Identifiers(http://, https://)Ending Domains(.com, .edu, .gov)返回網站,這也是您遇到錯誤的另一個原因。

0

你提到你打開了一個連接到你的「本地服務器」 我假設你是在同一臺計算機上做這個服務器上的主機?

  • 嘗試使用其他計算機打開與本地服務器的連接。
1

代碼很好,效果很好。現在問題必須在運輸或網絡部分。我想說的是你不要求正確的服務器。如果你使用127.0.0.1而不是localhost,我認爲你不會遇到問題。所以,我的客人會在/etc/hostsC:\Windows\System32\drivers\etc\hosts中遇到問題。

我建議你嘗試一個簡單的測試:ping主機名,並檢查輸出,如果IP地址是好的。

3

我有類似的代碼正在工作,但我的請求頭很簡單。基本上只是:

con.setRequestProperty("User-Agent", "Mozilla/5.0"); 

如果簡化頭不幫忙,我會用時像小提琴手您的瀏覽器,然後發出請求看起來就像是捕捉流量。

2

您可以嘗試在您嘗試連接的API上通過在響應標頭中設置access-control-allow-origin:*屬性來實施CORS。

0

我面臨完全相同的問題。使用此,而非輸入localhost:

http://[::1]:8000/index.php