标签:Java java ret HttpURLConnection 会为 input output conn
最近使用java.net.HttpURLConnection做一些简单的测试程序,发现发送的报文体为空:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionTester {
private HttpURLConnection connectServerConn() throws IOException {
// set ServerServlet URL
String urlPath = "http://127.0.0.1"
+ ":7010" //
+ "/wtcapp" //
+ "/server";
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
System.out.println("HttpURLConnection: " + conn.getClass());
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/plain");
conn.connect();
return conn;
}
public void doTest01() {
try {
HttpURLConnection conn = connectServerConn();
OutputStream output = conn.getOutputStream();
InputStream input = conn.getInputStream(); // (1)
output.write("hello ".getBytes());
output.flush();
Thread.sleep(3000);
output.write("world!".getBytes());
output.flush();
output.close();
// (2)
StringBuffer ret = new StringBuffer();
int r = input.read();
while (r != -1) {
ret.append((char) r);
r = input.read();
}
System.out.println("ret:" + ret);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HttpURLConnectionTester tester = new HttpURLConnectionTester();
tester.doTest01();
}
}
截取报文发现:
POST /wtcapp/server HTTP/1.1
Content-Type: text/plain
User-Agent: Java/1.8.0_261
Host: 127.0.0.1:7010
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 0
Content-Length为0,报文体为空。
经过研究发现,只要把(1)行的代码,移动到(2)处理,问题就解决了:
public void doTest01() {
try {
HttpURLConnection conn = connectServerConn();
OutputStream output = conn.getOutputStream();
output.write("hello ".getBytes());
output.flush();
Thread.sleep(3000);
output.write("world!".getBytes());
output.flush();
output.close();
InputStream input = conn.getInputStream();
StringBuffer ret = new StringBuffer();
int r = input.read();
while (r != -1) {
ret.append((char) r);
r = input.read();
}
System.out.println("ret:" + ret);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
}
POST /wtcapp/server HTTP/1.1
Content-Type: text/plain
User-Agent: Java/1.8.0_261
Host: 127.0.0.1:7010
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 12hello world!
查看HttpURLConnection的源代码发现,原来conn.getInputStream();时,会将前面打开的OutputStream给close掉造成的。
java.net.HttpURLConnection源代码:
标签:Java,java,ret,HttpURLConnection,会为,input,output,conn 来源: https://blog.csdn.net/netyeaxi/article/details/121595434
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。