Android——网络通信(HttpUrlConnection)



Android的网络通信,由于版本的废弃,现在大体分以下两种:

1、HttpUrlConnection

2、OkHttp

Android网络通信无非就是发送请求、获得应答、解析应答。

请求方式有两种:get和post请求。

1、get请求是一种以明文方式追加在URL后面形式,不安全,但是使用起来方便。

2、post请求是以暗文显示的,如果连账号,密码这样的私密信息都在网址(URL)中显

示就太不安全了,适用 要比get稍微麻烦些。

3、get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方

式。

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方

式。

get:url:http://wwwtest.rupeng.cn:8888/QueryAvatarInfo.ashx

字段 action GetAllNames

这是get请求,需要在url后面添加?action=GetAllNames才会有结果。

http://wwwtest.rupeng.cn:8888/QueryAvatarInfo.ashx?action=GetAllNames
这里写图片描述

大致get请求就是url?key1=value1&key2=value2….一般都是get请求。

post则不会这样看出后面key和value,使用特殊的加密方式才可以找到。

先来说HttpUrlConection的get请求。

1.huc=URL.openconnection() 通过URL打开连接

2.huc.connect() 建立连接

3.huc.getinputstream() 获得读取流

如果需要字符串内容,定义字符串,通过读取流经典读法进行读取就可以了。

我们来尝试读取百度首页的字符串内容(其实是html代码)。

这里写图片描述

这里因为读取内容是耗时操作,需要放在子线程当中,子线程无非访问UI线程,整个内

容显示用TextView,用了AsyncTask封装来操作子线程。

 AsyncTask task = new AsyncTask(){

         @Override
         protected String doInBackground(URL... params) {
         // TODO Auto-generated method stub
         HttpURLConnection huc=null;
         StringBuffer buffer=new StringBuffer();
         try {
         huc=(HttpURLConnection) params[0].openConnection();
         huc.connect();
         InputStream inputStream = huc.getInputStream();
         int len=0;
         byte b[]=new byte[1024];
         while((len=inputStream.read(b))!=-1)
         {
         buffer.append(new String(b,0,len));
         }


         } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         }finally {
         huc.disconnect();
         }

         return buffer.toString();
         }
         @Override
         protected void onPreExecute() {
         // TODO Auto-generated method stub
         super.onPreExecute();
         }
         @Override
         protected void onPostExecute(String result) {
         // TODO Auto-generated method stub
         super.onPostExecute(result);
         tv.setText(result);

         }

         @Override
         protected void onProgressUpdate(Void... values) {
         // TODO Auto-generated method stub
         super.onProgressUpdate(values);
         }

         };
         URL params = null;
         try {
         params = new URL("http://www.baidu.com");
         } catch (MalformedURLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         }
         task.execute(params);

来个更高级的,通过网络下载文件(金山卫士),我们弹出dialog来显示进度。

这里写图片描述

下载结束后会多出jianshan.exe文件

这里写图片描述

total = huc.getContentLength();可以获得文件的总大小。

HttpUrlConnection的post请求无非多了几步。

在huc.connect之前先进行huc.setRequestMethod(“POST”);设置请求是post,默认

是get写不写无所谓。在连接之后需要加上后面的key=value信息,是通过写流写进去的

OutputStream os = huc.getOutputStream();

os.write(“action=GetAllNames”.getBytes());

这里写图片描述

同样能达到get效果。

涉及到网络和sdcard需要加载网络权限和挂载sdcard和写入权限。