【问题标题】:"SocketException: Unexpected end of file from server" from servlet but not from standalone application来自servlet但不是来自独立应用程序的“SocketException:来自服务器的文件意外结束”
【发布时间】:2012-07-01 04:51:14
【问题描述】:

我想从我的 servlet 中调用一个 servlet。我可以从独立应用程序调用远程 servlet,但不能从我的 servlet 调用它(它在 Glassfish 上)。我使用完全相同的代码进行调用(我在最后一行代码中得到错误):

URL serverAddress = new URL(endpoint);
//Set up the initial connection
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setReadTimeout(timeOut);
connection.setRequestProperty("Content-Type", "text/xml; charset=ISO-8859-1");
connection.connect();
OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
wr.write(requestBody);
wr.flush();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

怀疑这段代码无法读取远程 servlet 的响应,因此 servlet 可能根本没有回复。但是,为什么当我从独立应用程序调用它时它会回复?我真的不明白... 我得到了这个例外:

java.net.SocketException: Unexpected end of file from server
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:769)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:766)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)

有人知道吗? servlet 是否有可能限制不使用 HttpURLConnection?谢谢!

【问题讨论】:

  • 两种情况下的“端点”真的一样吗?

标签: java servlets httpurlconnection


【解决方案1】:

在我们的例子中,它是 tomcat 设置为 http2 协议(默认情况下移除了强制使用 http2 协议, 消除 <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> 来自 server.xml 在 tomcat config 文件夹中 ,但是客户端使用http1.1,java也需要用证书(keyimport工具)签名,所以底层问题有点棘手......

【讨论】:

    【解决方案2】:

    查看您点击的网址。 我遇到了同样的问题,经过多次回归后才知道生成的 url 比被点击有一个空格,这是问题的原因,通过用 underscore 替换 space 解决了它
    你也可以通过调用URIEncoder.encode(uri);将其编码为url,记住只有?之后的uri部分应该被编码。

    【讨论】:

    • 对我来说,它是一个包含空格字符的 URL 参数! :( 我必须使用 URLEncoder.encode 作为参数将其转换为网络友好格式!! :) 谢谢
    【解决方案3】:

    这可能是因为未设置 Content-Length 标头。并且因为没有发送 POST 请求正文的结束。服务器正在等待直到流结束超时。

    您应该尝试以下两件事以使其正常工作:

    • 在做connect()之前用请求体大小设置内容长度头
    • 尝试关闭发送 POST 请求结束的connection.getOutputStream().close()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多