有关URLConnection的一点疑问

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?结果证明依然报错

我想知道,是我哪块理解错了吗?很奇怪。

 

你可能感兴趣的:(android,互联网)