再探网络连接--HttpURLConnection

本文对比了HttpURLConnection与HttpClient在Android开发中的应用。详细介绍了两者之间的主要区别、优缺点以及执行流程,特别强调了Android环境中推荐使用的客户端及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,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.set RequestProperty( " Content-type " , " application/x-java-serialized-object " );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值