再探网络连接--HttpURLConnection

    xiaoxiao2025-11-27  8

    首先,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 " );
    转载请注明原文地址: https://ju.6miu.com/read-1304443.html
    最新回复(0)