javaconnectexception

ConnectException on one machine but not on another


I have the following code snippet:

private static String post(String msg) throws Exception {
    URL urlObj = new URL(host);
    HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();

    System.out.println(String.format("Send to url [%s]", urlObj));
    System.out.println(String.format("Port [%s]", con.getURL().getDefaultPort()));
    System.out.println(String.format("POST data [%s]", msg));

    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "text/xml; charset=utf-8");

    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(msg);
    wr.flush();
    wr.close();

    int respCode = con.getResponseCode();
    System.out.println(String.format("Response code [%s]", respCode));

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String response = "", s;
    while ((s = in.readLine()) != null) {
        response += s;
    }
    in.close();

    return response;
}

This method is part of a program which takes in a yyyyMMdd date string, wraps it in JSON, encrypts the JSON string in base 64, and then sends it to a https web service as a query.

I run the program on my personal laptop, connected to the Internet, and is able to successfully query and process the result. I can also visit the web service URL and submit a query manually.

However, on my server which is connected to the Internet via a proxy, I can still manually query the web service via browser, but I now get an exception when I run the same program:

java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625)
    at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
    at com.chinkai.EvaWSAgent.post(EvaWSAgent.java:87)
    at com.chinkai.EvaWSAgent.retrieve(EvaWSAgent.java:50)
    at com.chinkai.EvaWSAgent.main(EvaWSAgent.java:155)

...where line 87 is

DataOutputStream wr = new DataOutputStream(con.getOutputStream());

I'm not sure how to troubleshoot this, or if there's any way I can rewrite this method to get around, or if it's even my problem in the first place (settings in the proxy, maybe?) Not sure if this is the correct place to raise this question, but here's trying my luck anyway.


Solution

  • If the server is connected to internet via proxy, you need to set it in your application aswell, e.g. like that:

    URL urlObj = new URL(host);
    
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.yourdomain.com", 3128));
    HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(proxy);