java的网络编程中,可以使用URLConnection从某个Web资源获取信息。而在操作一个URLConnection对象是,我们需要:
1.通过URL类的OpenConnection方法获取URLConnection对象;
2.设置任意的请求属性;setDoInput/setDoOutput/setUseCaches....;
3.调用connection方法连接远程资源;
4.连接建立后可查询头信息(这个未相信研究)
5.getInputStream(),解析输出流;
在阅读《java核心技术II》的网络部分时 了解到,在默认情况下,建立的连接只有只能从服务器读取信息的输入流,而无任何写操作(输出流),如果需要的话就需要在第二步设置上setOutputStream(true),然后才可以在连接建立后通过getOuputStream(),通过它将字节流write()给服务器的。
于是,我就做了个测试,我的客户端只需要接收服务器的信息(inputstream.read()),而不必post/get向服务器写入信息,对于outputstream我就设置为默认值,然后运行程序,会报null指针异常,而只有:
urlConn.setDoOutput(true);
OutputStream out = urlConn.getOutputStream();
out.flush();
out.close();
空操作,也是没问题的。
奇怪了,这是怎么回事呢?
/*
* 发送http请求
*/
public static String sendToServerAndGetFeedBack(String strUrl) {
HttpURLConnection urlConn = null;
StringBuffer sb = new StringBuffer();
String sCurrentLine = "";
try {
URL httpurl = new URL(strUrl);
urlConn = (HttpURLConnection) httpurl.openConnection();
urlConn.setRequestProperty("Content-Type",
"application/octet-stream");
urlConn.setRequestProperty("pure-data", "yes");
urlConn.setRequestProperty("Connection", "Keep-Alive");
urlConn.setDoOutput(true);
OutputStream out = urlConn.getOutputStream();
out.flush();
out.close(); //如果注释了这段红的,程序就会报错。
// url请求返回code值
int res = urlConn.getResponseCode();
if (res == LINK_OK) {
System.out.println("连接成功!");
InputStream is = urlConn.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
while ((sCurrentLine = reader.readLine()) != null)
if (sCurrentLine.length() > 0)
sb.append(sCurrentLine.trim());
} else {
System.out.println("连接失败!反馈码是:" + res);
}
}
catch (Exception e) {
}
return sb.toString();
}
我有了这样的假设:
1.难道默认值不是false?结果证明依然报错
我想知道,是我哪块理解错了吗?很奇怪。