首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改POST java.io.IOException:未找到由java.io.EOFException:\n引起的连接上的意外流结束:

修改POST java.io.IOException:未找到由java.io.EOFException:\n引起的连接上的意外流结束:
EN

Stack Overflow用户
提问于 2020-04-25 06:51:54
回答 3查看 6.4K关注 0票数 4

我已经经历了所有与此相关的问题,但我还没有找到一个对我有用的解决方案。

我在使用retrofit 2.8.1OkHttp 4.5.0

我的服务接口看起来如下

代码语言:javascript
运行
复制
public interface MlApiService
{
    @POST
    @Multipart
    Call<List<PreprocessedDocument>> postDocument( @Url String apiUrl, @Part MultipartBody.Part document,
    @Part ( "document_id") RequestBody documentId );
}

然后像下面这样构建客户机,并将requestTimeoutInSeconds设置为90秒。

代码语言:javascript
运行
复制
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 );
}

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

代码语言:javascript
运行
复制
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)

我迄今尝试过的几件事

  1. retryOnConnectionFailure(true)
  2. .addHeader("Connection","close")
  3. .header("Accept-Encoding",“身份”)

API在postman中运行良好,但当我尝试使用代码时,它就失败了。所以我尝试了邮递员发送的同样的标题。还是没有运气。

很少有意见:

  1. ,它有时起作用。不会总是失败。(同一个文件总是适用于邮递员)
  2. --它总是适用于其他文件(从未出现问题)。
  3. --请求到达服务器,处理请求时没有任何错误,并且响应也是如此。在服务器完成处理并返回客户端.

后,我立即得到错误信息。

编辑1:我点击的服务器是由gunicorn/20.0.4支持的,并且使用了烧瓶。我没有访问服务器代码的权限。我怀疑接收到的响应是否存在导致错误的垃圾字符。我不知道如何记录原始响应,然后才能被retrofit/okhttp读取。

编辑2:

我详细地运行了Curl命令,这就是我得到的结果。

从server

  • Connection #0到主机xx.9的
  • 空回复保持不变:(52)来自服务器

的空回复

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-27 10:48:53

短篇小说

问题是我撞到的服务器。它没有发出任何回应(字面意思是什么都没有。)没有标题,没有身体,什么都没有)。

长话短说

因此,在翻阅了堆叠溢出、其他好网站的所有相关答案,并尝试了我在问题中提到的这么多解决方案之后,它并没有解决我的问题。

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

代码语言:javascript
运行
复制
okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:203)

客户端(我的代码)正在尝试读取响应头,这时抛出了错误java.io.EOFException: \n not found: limit=0 content=

这给了我一个提示,问题可能是服务器而不是客户端的问题。因此,我想我应该尝试与另一个客户,看看我是否能看到原始的反应。

我想到的第一个工具是Curl (邮递员用来给出通用的无法得到任何响应,而且这种情况并没有持续发生)。我点击服务器使用卷曲和详细的选项和砰!我得到了以下答复:

代码语言:javascript
运行
复制
curl -v --location --request POST '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)。

故事的寓意:有时必须逐字阅读堆栈跟踪,即使它似乎不值得查看:)

票数 6
EN

Stack Overflow用户

发布于 2020-04-27 06:22:49

你会得到一个没有状态行的空回复。这就是问题所在。HTTP-请求通常返回一个状态行(例如HTTP/1.1 200 OK\r\n),其中包含状态代码(参见https://www.ietf.org/rfc/rfc2616.txt第6.1章)。这通常是服务器错误。

票数 1
EN

Stack Overflow用户

发布于 2020-09-25 00:19:32

很可能有两件事同时发生。

首先,url包含一个不常用的端口,其次,您使用的是不支持该端口的VPN或代理。

我个人也有同样的问题。

我的服务器端口是45860,我使用的是pSiphon反过滤虚拟专用网.

在这种情况下,我的邮递员只有在服务器的relpy是状态码大于0的错误时才报告“连接挂起”。(当一些文本从服务器返回时没有错误代码,这是很好的)

然后,我在服务器上将我的web服务端口更改为8080,哇,它起作用了!虽然psiphon vpn是连接的。

因此,我的建议是,如果您可以更改服务器端口,那么就尝试它,或者检查是否存在代理问题。也许您的邮递员和acual应用程序不在同一个机器上。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61422009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档