【问题标题】:How to fix "End of stream on null" network issue?如何解决“空流结束”网络问题?
【发布时间】:2019-12-25 11:33:51
【问题描述】:

我的 Android 应用程序的一些用户经常遇到网络错误,并显示以下错误消息:"Unexpected end of stream on null".

通过查看其他类似问题,我没有找到任何明确的方法来解决它。我无法重现网络错误。

1) 我没有成功地将Connection=close 附加到请求标头,正如this answer 建议的那样

2) 我没有成功添加.retryOnConnectionFailure(true),正如this answer 建议的那样

3) 我没有成功搜索服务器端问题,正如this answer 建议的那样,但是有网络问题的请求没有出现在 nginx access.log 文件中

这是我如何初始化改造

OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(40, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .build();

Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient);

this.retrofit = retrofitBuilder.build();

这是我的端点定义(在 IUserService.java 中)

@POST("/v2/android/login/phone")
@Headers("Content-Type: application/json;charset=UTF-8;Connection=close")
Call<APIResult<Session>> phoneLogin(@Body APIRequest request);

这是查询端点的方式

userService = retrofit.create(IUserService.class);
Call<APIResult<Session>> call = userService.phoneLogin(request);
call.enqueue(new GenericCallback<>(context, callback));

我们的配置:

Android (Java)

改造 2.3.0:'com.squareup.retrofit2:retrofit:2.3.0'

好的http 3.12.1:'com.squareup.okhttp3:okhttp:3.12.1'

在 AWS Elastic Beanstalk 上运行的服务器,平台:Puma 和 Ruby 2.6 在 64 位 Amazon Linux/2.9.0 上运行

谁能更好地解释问题出在哪里?知道如何在本地重现此问题吗?有什么办法可以解决这个问题?

【问题讨论】:

  • 你能提供你的代码的最小工作示例吗?
  • 这似乎是this issue,这是 OkHttp 中的一个已知问题。我强烈建议Volley,一个基于谷歌的网络库,我一直在使用很多,没有任何已知问题(Android-K 的大多数客户端,以及少数 L、M、N 客户端)......如果 OkHttp是必须的,那么请尝试在问题中添加堆栈跟踪。
  • 你知道是什么情况导致了这个问题
  • 能否将Http请求&响应日志(成功和失败情况)也附上header?
  • @Bonatti 我们确实必须使用 Okhttp。我暂时无法提供堆栈跟踪,我会尽快回来提供一个

标签: android retrofit okhttp amazon-elastic-beanstalk aws-ebs


【解决方案1】:

从堆栈跟踪,在cmets中,可以看出问题出在:

Caused by java.io.EOFException: \n not found: limit=0 content=…

所以,这是the original issue。内容的 GZIP 缩减很可能没有按预期执行,或者至少接收器没有预期它,也没有解码。 MDN source。尝试如下操作:

.addHeader("Accept-Encoding", "identity")

如果这不起作用,则可能是服务器错误,正如other stackoverflow answer 所述。请注意,您应该在其他工具上测试页面 URL(例如 CURL 或其他工具,以排除服务器问题)

【讨论】:

  • 我们很快就会发布带有附加标题的版本。如果解决了问题我会告诉你的,谢谢
  • 如果可能,添加您可能拥有的任何其他信息。它看起来像服务器问题,很可能由于丢失或流性质,客户端无法理解回复。设置和接收哪些标头?当使用 CURL 或任何其他工具进行测试时,实际结果是什么?发生故障的设备有哪些特点等。
【解决方案2】:

看起来更像是服务器问题,您可以尝试按照this 链接的建议将您的服务器配置为 60 秒(默认)的 keep_alive 超时。

【讨论】:

  • 我们目前正在对其进行测试。如果它有效,我会更新你,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2012-06-03
相关资源
最近更新 更多