2014-09-20 4 views
10

Я знаю, что есть несколько вопросов по этой теме. Но я не нашел ответа ни в одном из них.Java HttpUrlConnection throws Connection Refused

Я пытаюсь открыть соединение с моим локальным сервером, но я все время отказываюсь от связи.

У меня работает сервер, и я проверил соединение с браузером и с приложением Google, которое называется Postman, и оно работает.

Неисправность при открытии соединения, как будто там, где нет ничего для подключения. или что-то блокирует соединение? Я тестировал с брандмауэром и антивирусом, не повезло.

тестирование в Почтальон URL-адрес возвращает пользователя, как он должен ...

Если я заменить URL с «http://www.google.com» Это работает отлично.

вот мой код:

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 с? –

+0

Да ... я предполагаю, что что-то блокирует Java от открытия локального соединения: P –

+0

Хорошо, я пробовал просто подключиться к http: // localhost и работает, проблема http: // localhost: 8000 : p Я не знаю, почему –

ответ

2

Сделаю дикое предположение, что может быть проблема. Возможно, проблема с IPv4/IPv6.

Если да, то здесь возможны два решения

  • Если сервер слушает только на ipv6 адрес, измените его на прослушивание ipv4.
  • Если сервер слушает ipv4, а затем заставить Java использовать ipv4 с java.net.preferIPv4Stack=true
+0

Пробовал это, но это не сработало. Мой URL-адрес похож на «http: // my-host-name: 51234/abc». Он работает из браузера, но теперь из java HttpUrlconnection. –

+0

если я изменю его на «http: // locahost: 8080/abc», он работает с кодом Java. Не знаю, почему использование «my-host-name» не работает для меня. –

+0

Хорошо, это работает, когда у вас есть фактический IP-адрес вместо имени хоста 'my-host-name'? Если это так, то это проблема перевода имени хоста на IP, то есть проблема DNS. – gustf

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/hosts или C:\Windows\System32\drivers\etc\hosts.

Я советую вам попробовать простой тест: ping имя хоста и проверить вывод, если ip-адрес является хорошим.

3

У меня есть аналогичный код, который работает, но мой заголовок запроса намного проще. В основном только:

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

Если упрощая заголовок не поможет, я бы захватить трафик при использовании браузера с чем-то вроде стельку, а затем сделать запрос выглядеть именно так.

2

Вы можете попробовать внедрить CORS в API, который вы пытаетесь подключить, установив свойство access-control-allow-origin:* в заголовке ответа.

0

Я столкнулся с такой же проблемой. Используйте вместо локального хоста:

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