1

我使用 google gcm 服务器演示来构建通知服务器。但我发现当得到 gcm 的响应时它会被阻止。conn.setConnectionTimeout 和设置 conn.readTimeOut 也无效。有什么好的解决办法吗?

String requestBody = gson.toJson(jsonRequest);
    HttpURLConnection conn = post("https://android.googleapis.com/gcm/send", "application/json",
            requestBody);
    conn.setReadTimeout(CONNECTION_READ_TIMEOUT);
    int status = conn.getResponseCode();

有时,它会在 conn.getResponseCode() 处阻塞。我发现jstack如下:

    at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
- locked <0x0000000783dcaff8> (a java.lang.Object)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:755)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
- locked <0x0000000783dcb098> (a com.sun.net.ssl.internal.ssl.AppInputStream)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x0000000783de10a0> (a java.io.BufferedInputStream)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
- locked <0x0000000783de3380> (a sun.net.www.protocol.https.DelegateHttpsURLConnection)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at com.net.service.gcm.Sender.sendNoRetry(Sender.java:219)
at com.net.service.gcm.Sender.send(Sender.java:115)
4

0 回答 0