当前位置: 首页 > 知识库问答 >
问题:

改造java.io.ioException后:java.io.eofException导致连接上的流意外结束:\n未找到:

秦联
2023-03-14

我的服务接口如下所示

public interface MlApiService
{
    @POST
    @Multipart
    Call<List<PreprocessedDocument>> postDocument( @Url String apiUrl, @Part MultipartBody.Part document,
    @Part ( "document_id") RequestBody documentId );
}

我像下面这样构建客户机,并将RequestTimeoutInSeconds设置为90秒。

public void init()
{
    GsonBuilder gson = new GsonBuilder();
    gson.registerTypeAdapter( new TypeToken<List<PreprocessedDocument>>() {}.getType(), new CustomResponseDeserializer() );

    HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
    logInterceptor.setLevel( HttpLoggingInterceptor.Level.HEADERS );

    OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure( true ).addInterceptor( logInterceptor )
        .readTimeout( requestTimeoutInSeconds, TimeUnit.SECONDS ).build();
    //Dummy Base URL must be provided. otherwise client won't get initialized
    Retrofit retrofit = new Retrofit.Builder().baseUrl( "http://thisIsJustDummyUrlForTheSakeOfAddingBaseUrl.com/" )
        .client( client ).addConverterFactory( GsonConverterFactory.create( gson.setLenient().create() ) ).build();
    mlApiService = retrofit.create( MlApiService.class );
}

请求到达服务器,就在服务器响应时,我得到以下错误:

Caused by: java.io.IOException: unexpected end of stream on Connection{34.XXX.XXX.9:8085, proxy=DIRECT hostAddress=/34.XXX.XXX.9:8085 cipherSuite=none protocol=http/1.1}
    at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:203)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
Caused by: java.io.EOFException: \n not found: limit=0 content=…
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:227)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:211)
    at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:187)
    null
  1. 它有时起作用。并不总是失败。(同一个文件总是与postman一起工作)
  2. 它始终适用于其他文件(从来没有问题)。
  3. 请求到达服务器,处理请求时没有任何错误,也会响应。在服务器完成处理并响应客户端后,我立即得到错误。

编辑1:我点击的服务器由gunicorn/20.0.4支持,并使用flask。我无法访问服务器代码。我怀疑发送到的响应中是否有一些垃圾字符导致了错误。我不知道如何在regetfit/okhttp读取原始响应之前将其记录下来。

编辑2:

    null

共有1个答案

曹恩
2023-03-14

问题出在我打的服务器上。它没有发送任何回应(字面上什么都没有。没有头,没有身体,什么都没有)。

因此,在浏览了stackoverflow和其他好网站上的所有相关答案,并尝试了我在问题本身中提到的许多解决方案后,它并没有解决我的问题。

在仔细阅读堆栈跟踪之后,我遇到了下面一行。

okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:203)

这给了我一个提示,问题可能出在服务器上,而不是客户端。所以我想我应该和另一个客户试试,看看我是否能看到原始的反应。

我想到的第一个工具是curl(用于给出泛型的Postman不能得到任何响应,而且这种情况并不一致)。我用curl和verbose选项击中服务器!我得到了以下回应:

curl -v --location --request POST 'html" target="_blank">http://XX.XXX.XXX.9:8085/psc/document_upload' --form 'document=@/home/user376/Downloads/test-1.pdf' --form 'document_id=22004494_ae7f_4998_a1d8_73249bda9905'
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying XX.XXX.XXX.9...
* Connected to XX.XXX.XXX.9 (XX.XXX.XXX.9) port 8085 (#0)
> POST /psc/document_upload HTTP/1.1
> Host: XX.XXX.XXX.9:8085
> User-Agent: curl/7.49.0
> Accept: */*
> Content-Length: 4684053
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------a8446c7eedb10689
> 
< HTTP/1.1 100 Continue
* Empty reply from server
* Connection #0 to host XX.XXX.XXX.9 left intact
curl: (52) Empty reply from server

这证实了问题出在服务器上,而不是客户端(Retrofit/http)。

这个故事的寓意:有时你必须一个字一个字地阅读stacktrace,即使它似乎不值得看:)

 类似资料:
  • 我得到意外结束流,而使用改造(2.9.0)与OkHttp3(4.9.1) 改装配置: 到目前为止,我发现了以下几点: 这个问题只发生在我使用从Windows系列操作系统(7、10、11)运行的Android Studio模拟器时——这是在来自不同网络的两台不同笔记本电脑上复制的 如果在苹果操作系统下运行Android Studio模拟器,那么在所有情况下,问题都不会再现 ARC/Postman客户

  • 我已经按照此链接刷新了访问令牌。在将身份验证器添加到okHttp时,从改造回调onFailure方法中获取okhttp3上的意外流结束错误

  • 我试图读取字节数组的内容创建gzip一个对象,但是当我试图解压缩字节数组的内容我得到一个错误声明:java.io.EOFException:意外结束ZLIB输入流 我试图使用java的try with resources习惯用法来管理流资源,同时压缩和解压缩一个对象,但是如果我将ByteArrayOutputStream添加到try with resources块中,另一个流ObjectOutpu

  • 问题内容: Redis 3.0.5 Spring数据Redis 1.3.6 jedis 2.6.3- 我们的Web应用程序,它通过pub / sub从redis接收数据。 -还以键/值对的形式对redis进行数据读/写。 -读/写发生在侦听器线程,独立监视线程和http请求线程上。 -我们对侦听器和Redis模板使用了相同的连接工厂 -我们的Redis服务器已配置“ timeout = 30” 在

  • 我读过其他线程,谈到使用单线程进行读/写。但是在我们的情况下,很难使用单线程。同样,根据RedisTemplate文档,它是线程安全的。该问题是偶然的,我们无法在任何开发/测试/UAT环境中重现。因此无法找到相同的确切原因。我们做错了什么?

  • 当我发现这个的时候,我已经有一段时间了。使用swankjesse提供的解决方案后,错误消失了。我只是不明白为什么这是一个解决办法。我在网上找不到任何解释这种方法解决错误的原因的东西。