来自servlet的“SocketException:来自服务器的文件的意外结束”,但不是来自独立应用程序

问题描述 投票:4回答:3

我想从我的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根本不会回复。但是,当我从standlone应用程序调用它时,为什么会回复?我真的不明白......我得到了这个例外:

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
3个回答
4
投票

这可能会发生,因为没有设置Content-Length标头。并且因为POST结束请求正文未发送。服务器最终等到流结束超时。

你应该试试这两件事才能让它发挥作用:

  • 在执行connect()之前,使用请求正文大小设置内容长度标题
  • 尝试关闭发送POST请求结束的connection.getOutputStream().close()

3
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.