【问题标题】:SocketException when connecting to HttpURLConnection after accessing HttpsURLConnection访问 HttpsURLConnection 后连接到 HttpURLConnection 时出现 SocketException
【发布时间】:2017-05-03 04:53:49
【问题描述】:

我有一个函数,它使用 HttpUrlConnection 来调用远程客户端上的服务。这个函数工作正常,直到我们添加了一个只能使用 HttpsUrlConnection 调用的新的安全远程客户端。

调用新的https远程客户端正常,调用新客户端后,旧客户端在尝试获取InputStream对象时会返回java.net.SocketException: Connection reset

我的代码如下所示:

conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.setRequestMethod("POST");
out = conn.getOutputStream();
writer = new OutputStreamWriter(out);
writer.write(strJson);
writer.close();
in = conn.getInputStream();  // connection reset error here.
reader = new InputStreamReader(in);
rd = new BufferedReader(reader);
while ((line = rd.readLine()) != null) {
    result += line;
}
rd.close();
in.close();
reader.close();
out.close();
conn.disconnect();

有人知道发生了什么吗? 提前谢谢你。

堆栈跟踪是这样的:

java.net.SocketException: Connection reset 
   at java.net.SocketInputStream.read(SocketInputStream.java:196)
   at java.net.SocketInputStream.read(SocketInputStream.java:122)
   at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
   at sun.security.ssl.InputRecord.read(InputRecord.java:480)
   at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
   at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:891)
   at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
   at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
   at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
   at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
   at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:690)
   at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
   at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:661)
   at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)
   at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

【问题讨论】:

  • 请跟踪堆栈。
  • 通常要连接 Https URL,您必须将安全证书添加到您的应用程序。
  • 在“in = conn.getInputStream()”这行之前,可以添加conn.setDoInput(true)来表示应用程序打算从连接中读取输入吗?
  • @OTM 像你要求的那样做导致 java.lang.IllegalStateException: Already connected 错误。
  • 你可以尝试将 writer.close() 移动到你有关闭方法的地方吗?

标签: java httpurlconnection httpsurlconnection


【解决方案1】:

我仍然不知道是什么导致了错误发生。我的解决方案就是不使用 java.net.HttpURLConnection,而是使用 org.apache.http.impl.client.DefaultHttpClient。

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多