JDK中的URLConnection参数详解(1)(2)
6:> Servlet端的开发注意点:
a:) 对于客户端发送的POST类型的HTTP请求,Servlet必须实现doPost方法,而不能用doGet方法。
b:) 用HttpServletRequest的getInputStream()方法取得InputStream的对象,比如:
- InputStream inStream = httpRequest.getInputStream();
现在调用inStream.available()该方法用于“返回此输入流下一个方法调用可以不受阻塞地从此输入流读取或跳过)的估计字节数”)时,永远都反回0。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。那么,现在的解决办法是Servlet这一端用如下实现:
- InputStream inStream = httpRequest.getInputStream();
- ObjectInputStream objInStream = new ObjectInputStream(inStream);
- Object obj = objInStream.readObject();
- // 做后续的处理
- // 。。。。。。
- // 。。。 。。。
- 而客户端,无论是否发送实际数据都要写入一个对象那怕这个对象不用),如:
- ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
- objOutputStrm.writeObject(new String("")); // 这里发送一个空数据
- // 甚至可以发一个null对象,服务端取到后再做判断处理。
- objOutputStrm.writeObject(null);
- objOutputStrm.flush();
- objOutputStrm.close();
注意:上述在创建对象输出流ObjectOutputStream时,如果将从HttpServletRequest取得的输入流(即:new ObjectOutputStream(outStrm)中的outStrm)包装在BufferedOutputStream流里面,则必须有objOutputStrm.flush();这一句,以便将流信息刷入缓冲输出流。如下:
- ObjectOutputStream objOutputStrm = new ObjectOutputStream(new BufferedOutputStream(outStrm));
- objOutputStrm.writeObject(null);
- objOutputStrm.flush(); // <======此处必须要有.
- objOutputStrm.close();
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
- System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串);
- System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);
其中:
- sun.net.client.defaultConnectTimeout:连接主机的超时时间单位:毫秒)
- sun.net.client.defaultReadTimeout:从主机读取数据的超时时间单位:毫秒)
例如:
- System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
- System.setProperty("sun.net.client.defaultReadTime
Java中可以使用HttpURLConnection来请求WEB资源。
HttpURLConnection对象不能直接构造,需要通过URL.openConnection()来获得HttpURLConnection对象,示例代码如下:
- String szUrl = "http://www.ee2ee.com/";
- URL url = new URL(szUrl);
- HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
- System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串);
- System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);
其中:
- sun.net.client.defaultConnectTimeout:连接主机的超时时间单位:毫秒)
- sun.net.client.defaultReadTimeout:从主机读取数据的超时时间单位:毫秒)
例如:
- System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
- System.setProperty("sun.net.client.defaultReadTimeout", "30000");
JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:
- setConnectTimeout:设置连接主机超时单位:毫秒)
- setReadTimeout:设置从主机读取数据超时单位:毫秒)
例如:
- HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
- urlCon.setConnectTimeout(30000);
- urlCon.setReadTimeout(30000);
需要注意的是,笔者在JDK1.4.2环境下,发现在设置了defaultReadTimeout的情况下,如果发生网络超时,HttpURLConnection会自动重新提交一次请求,出现一次请求调用,请求服务器两次的问题Trouble)。我认为这是JDK1.4.2的一个bug。在JDK1.5.0中,此问题已得到解决,不存在自动重发现象。out", "30000");
用户点评