java.io.IOException:stream已重置:多个设备上的REFUSED_STREAM

时间:2016-10-28 20:42:49

标签: android https retrofit okhttp http2

我在Android应用中使用了Retrofit 1.9。

服务器在Django上使用Nginx,HTTPS使用HTTP 2.证书来自WoSign," A"在SSL实验室得分。

我在3台设备上进行测试:

  • Nexus 4,Android 5.1.1(官方)
  • Nexus 9,Android 7.0(官方)
  • 三星Galaxy S3,Android 4.4(官方)

在SGS3上它工作正常,但在Nexus 4& 9我得到例外:

java.io.IOException: stream was reset: REFUSED_STREAM
                                                               at com.squareup.okhttp.internal.framed.FramedStream.getResponseHeaders(FramedStream.java:146)
                                                               at com.squareup.okhttp.internal.http.Http2xStream.readResponseHeaders(Http2xStream.java:150)
                                                               at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:737)
                                                               at com.squareup.okhttp.internal.http.HttpEngine.access$200(HttpEngine.java:87)
                                                               at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:722)
                                                               at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576)
                                                               at com.squareup.okhttp.Call.getResponse(Call.java:287)
                                                               at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
                                                               at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)
                                                               at com.squareup.okhttp.Call.execute(Call.java:80)
                                                               at retrofit.client.OkClient.execute(OkClient.java:53)
                                                               at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
                                                               at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
                                                               at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
                                                               at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                               at retrofit.Platform$Android$2$1.run(Platform.java:142)
                                                               at java.lang.Thread.run(Thread.java:761)

3 个答案:

答案 0 :(得分:2)

如果有人仍然有问题(2018)。

我已通过将改造版本更新为

解决了该问题
 implementation 'com.squareup.retrofit2:retrofit:2.4.0'

答案 1 :(得分:1)

我已经解决了这个问题。这是一个Nginx bug

此问题已在Nginx 1.11中修复。因此,解决方案只是更新到NGINX 1.11(当前主线)。

答案 2 :(得分:1)

就我而言,nginx已经更新为1.11.x.我的罪魁祸首是okhttp和改造。当我尝试发出PUT请求时,它会因stream was reset: REFUSED_STREAM而失败。

为了解决这个问题,我升级到两者的最新版本,当时我写的是:

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'

如果您正在使用改装2.0.x或okhttp 3.1.x,升级应该可以解决问题。