再探网络连接--HttpURLConnection

来源:互联网 发布:按键精灵修改mac 编辑:程序博客网 时间:2024/05/22 05:23

首先,HttpURLConnection应该算是HttpClient的替换者,度娘说HttpClient是对于HttpURLConnection的封装,这里由于不能拜读源码,所以没有办法验证,但是HttpClient确实有那么一点封装的意思。

---------HttpClient链接地址-----------


介绍:HttpURLConnection是一个和服务器servlet交互的轻量级组件,它是基于socket层的请求层API。


二者的区别:

        1.首先,HttpClient是属于org.apache.http包下的各个Api,而HttpURLConnection是java.net下的组件,二者有着本质的区别,Httpclient拥有众多Api、BUG较少、实现稳定,这使得它的可维护和扩展性降低,所以Android团队更新它的积极性较低。并且在Android2.3及之后更推荐使用HttpURLConnection。Android5.1中HttpClient已成过时。 

2.HttpClient封装性高,使用简单。而HttpURLConnection是一个轻量级的组件,它的可扩展性高。

这两种方式都支持HTTPS协议、以流的形式进行上传和下载、配置超时时间、IPv6、以及连接池等功能


HttpURLConnection的优势:API简单、体积较小,所以非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。


执行顺序:

验证自Debug,由于没有UML,只能用画图工具(真难用啊!),如图:



----------------------------------------我是华丽的分割线---------------------------------------------

HttpURLConnection urlConnection=null;//创建URL(统一资源定位器)对象URL u=new URL(url);//获得一个URLConnection(可设定代理),并没有链接服务器urlConnection=(HttpURLConnection)u.openConnection();//设置超时urlConnection.setConnectTimeout(30000);urlConnection.setReadTimeout(30000);//设置请求的方式urlConnection.setRequestMethod("POST");urlConnection.setDoInput(true);//设置是否从网络读取数据urlConnection.setDoOutput(true);//设置是否向网络发出数据请求//设置处理请求参数的字符串StringBuffer body = new StringBuffer();if(params != null && !params.isEmpty()){Set<Entry<String,String>> entites = params.entrySet();boolean isFirst = true;for(Entry<String, String> entry : entites){if(!isFirst){body.append("&");}body.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(),"UTF-8"));isFirst = false;}//创建ObjectOutputStream输出流,输出流基本都可以,这一步才开始联网ObjectOutputStream obj=new ObjectOutputStream(urlConnection.getOutputStream());obj.writeBytes(body.toString());//清空缓冲区,并关闭连接obj.flush();obj.close();}//如果有session就上传if(null != JSESSIONID){urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSIONID);//req.setHeader("Cookie","JSESSIONID="+JSESSIONID);}//判断状态,是否为请求成功(200)if(urlConnection.getResponseCode() != HttpURLConnection.HTTP_OK){msg = "服务器繁忙,请稍后重试!";}else{//获得输入流InputStream is = urlConnection.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int ss = 0;while((ss = is.read(buffer))!=-1){baos.write(buffer,0,ss);}String responseBody = new String(baos.toByteArray(),"UTF-8");response = new JSONObject(responseBody);}//销毁链接urlConnection.disconnect();

请求方式的区别:

  GET:可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet。

  POST:参数不是放在URL字串里面,而是放在http请求的正文内。

异常解决:

1.Web服务器出现java.io.EOFExecption的原因是,移动端(安卓)向服务器发送数据的时候对象没有实现序列化,或不能解析。

解决方案:设置urlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");

2.调试的时候总是不过,或请求超时,或得不到数据,可能因为断点的存在。如设置了超时时间后再断点。 

解决方案:设置urlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
1 1
原创粉丝点击