1

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

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) 

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

+0

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

ответ

1

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

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