Карты Google и java.net.SocketTimeoutException: время ожидания чтения истекло

Код ниже имеет несколько проблем. Во-первых, это дает мне исключение SocketTimeoutException. Несколько дней назад это работало нормально, но теперь выдает эту ошибку. Я не уверен, как отследить проблему до источника. Я попытался увеличить тайм-аут (который, я действительно не думаю, что сработает в конце), но он всегда истекает через 18 секунд. Что еще более странно, URL-адрес работает, когда я пытаюсь получить файл JSON из чего-то другого (например, http://mysafeinfo.com/api/data?list=englishmonarchs&format=json). Я ждал около дня, и проблема все еще там. Могу ли я что-нибудь сделать, чтобы решить эту проблему?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Timer;
import java.util.TimerTask;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class SocketTimeoutError {

    public static void main(String args[]) {
        URL myURL;
        TimerTask task = null;
        try {
            myURL = new URL(
                    "https://maps.googleapis.com/maps/api/geocode/json?address=Chicago+Illinois");

            URLConnection conn = myURL.openConnection();
            conn.connect();
            conn.setConnectTimeout(4 * 600000);
            conn.setReadTimeout(4 * 600000);
            //
            Timer timer = new Timer();
            task = new TimerTask() {
                int time = 0;

                public void run() {
                    System.out.println(time++);
                }
            };
            //
            System.out.println("Connecting..." + "Timeout="
                    + conn.getConnectTimeout());
            timer.scheduleAtFixedRate(task, 0, 1000);
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            task.cancel();
            JSONParser parser = new JSONParser();
            JSONObject jsonObject = (JSONObject) parser.parse(in);
            String status = (String) jsonObject.get("status");
            System.out.println(status);

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

}

Вот мой вывод консоли:

Connecting...Timeout=2400000
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at SocketTimeoutError.main(SocketTimeoutError.java:38)

---Редактировать---
Я делал это на своей рабочей машине. Я только что попробовал этот код на своем домашнем компьютере, и он отлично работает. Кроме того, компания, в которой я работаю, имеет лицензию Google for Work. Однако я не понимаю, как это может быть проблемой сети между компанией и серверами Google, потому что я могу просматривать json в своем браузере Chrome.


person Hydrosis    schedule 25.06.2015    source источник
comment
Я бы сказал, что что-то происходит в брандмауэре вашей компании, ваш клиентский агент из вашего java-кода может показаться подозрительным вашему сетевому администратору, и они могут заблокировать ваш трафик, чтобы защитить лицензию Google for Work.   -  person kaho    schedule 25.06.2015


Ответы (1)


Я понял, в чем дело. Мне пришлось подключиться через прокси (что наши браузеры делают автоматически, и это объясняет, почему я получил ответ, когда использовал веб-браузер). Мне просто пришлось изменить свой код следующим образом:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.url.com", 80));
URLConnection myURLConnection = myURL.openConnection(proxy);
person Hydrosis    schedule 26.06.2015