HTTP通信

来源:互联网 发布:ubuntu安装1080驱动 编辑:程序博客网 时间:2024/06/05 06:48

什么是HTTP协议:

  超文本传送协议(HTTP-Hypertext transfer protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transfer-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

HTTP协议的主要特点:

<1.支持客户/服务器模式

<2.简单快速:客户像服务器请求服务时,只需要传送请求方法和路径。请求方法常用GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,是的HTTP服务器的程序规模较小,因而通信速度快。

<3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

<4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

<5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

工作流程:

  一次HTTP操作称为一个事务,其工作过程可分为四步:

<1.首先客户机与服务器需要建立连接,只要单机某个超级链接,HTTP的工作开始。

<2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:同一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

<3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

<4.客户端接收服务器所返回的信息通过浏览器显示在用户的屏幕上。然后客户机与服务器断开连接。

HTTP协议永远是客户端发起请求,服务器回送响应,这样就限制了使用HTTP协议,即无法实现在客户端没有发送请求的时候,服务器将消息推送给客户端。

HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的。

URL:

  统一资源定位符(UniformResourceLocator)也被称为网页地址,是因特网上标准的资源的地址。

URL的格式由下列三部分组成:

<1.协议(或称为服务方式)

<2.存有该资源的主机IP地址(有时也包括端口号)

<3.主机资源的具体地址,如目录和文件名等

如http://www.google.con/index.jsp


SYN(synchronous)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发送一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

ACK(Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发出来的数据已确认接收无误。

OSI(Open System Interconnection):开放系统互连模型(七层参考模型),OSI参考模型将整个网络通信的功能划分为七个层次,由低到高分别是物理层(PH)、数据链路层(DL)、网络层(N)、传输层(T)、会话层(S)、表示层(P)、应用层(A)。每层完成一定的功能,每层直接为上层提供服务,并且所有层次都互相支持。第四层到第七层主要负责互操作性,第一层到第三层用于创造两个网络设备间的物理连接。

TCP/IP四层协议:主机到网络层---网络层---传输层(tcp、udp)---应用层(ftp、telnet)

http请求的方式:

<1.GET            请求获取Request-URI所标识的资源

<2.POST          在Request-URI所标识的资源后附加新的数据

<3.HEAD          请求获取由Request-URI所标识的资源的响应消息报头

<4.PUT             请求服务器存储一个资源,并用Request-URI作为其标识

<5.DELETE      请求服务器删除Request-URI所标识的资源

<6.TRACE        请求服务器回送收到的请求信息,主要用于测试或诊断

<7.CONNECT  保留将来使用

<8.OPTIONS    请求查询服务器的性能,或者查询与资源相关的选项

什么是JSON格式:

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是基于JavaScript的一个子集。

HttpUrlConnection:

访问网络:

Mainfest添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

activity_main.xml添加WebView

自定义Http类为子线程访问网页

public class Http extends Thread {    private String url;    private WebView webView;    //由于需要更新UI,固声明Handler    private Handler handler;    //创建构造函数并指定参数    public Http(String url, WebView webView, Handler handler) {        //初始化        this.url = url;        this.webView = webView;        this.handler = handler;    }    @Override    public void run() {        try {            URL httpUrl =  new URL(url);            try {                //创建HttpUrlConnection对象,httpurl对象调用openConnection方法以对url进行http的访问                HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();                //设置请求超时时间                conn.setReadTimeout(5000);                //设置网络请求方式                conn.setRequestMethod("GET");                //创建一个StringBuffer作为缓冲                final StringBuffer sb = new StringBuffer();                //创建一个包装类,通过getInputStream方法拿到读入流,并把字符流转换为字节流。                BufferedReader reader = new BufferedReader(new InPutStreamReader(conn.getInputStream()));                String str;                while ((str=reader.readLine())!=null){                    //通过append方法向StringBuffer添加数据                    sb.append(str);                }                handler.post(new Runnable() {                    @Override                    public void run() {                        webView.loadData(sb.toString(),"text/html;charset=utf-8",null);//数据,数据类型,编码                    }                });                          } catch (IOException e) {                e.printStackTrace();            }        } catch (MalformedURLException e) {            e.printStackTrace();        }    }}

MainActivity.java

public class MainActivity extends AppCompatActivity {    private WebView webView;    private Handler handler = new Handler();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        webView = (WebView) findViewById(R.id.webView1);        //建立一个线程        new Http("http://www.lofter.com/login?urschecked=true",webView,handler).start();    }}

运行程序会出现E/eglCodecCommon: **** ERROR unknown type 0x73000d (glSizeof,80),这个问题没有解决。。但它并不影响程序运行,网上查了下基本说是可以忽略,大家有解决办法请留言谢谢~

通过get()传递参数给服务器:(发送数据量较小可用,通常几KB,并且发送的信息以Url显示出来不是很安全全全)

服务器搭建(eclipse j2ee)

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title></head><body><form action="MyServlet" method="get">name:<input type= "text"  name="name"><br>    code:<input type="text"  name="code"><br>submit:<input type="submit" value="submit"><br></form></body></html>


MyServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name = request.getParameter("name");String code = request.getParameter("code");PrintWriter out = response.getWriter();    //指定响应头文本类型response.setContentType("text/htm);;charset=utf-8");//中文输入会出现乱码,name 设置字符转码 new String(name.getBytes("iso-8859-1"),"utf-8")out.print("name="+new String(name.getBytes("iso-8859-1"),"utf-8")+",code="+code);System.out.println("name="+new String(name.getBytes("iso-8859-1"),"utf-8"));System.out.println("code="+code);}}


客户端代码:

布局regist.xml(随便添加了点多余的。。为了好看点0.0)

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="name"        android:id="@+id/ip_name"        android:layout_centerInParent="true"        android:paddingLeft="40dp"        android:paddingRight="40dp"        />    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/ip_name"        android:hint="code"        android:paddingLeft="40dp"        android:paddingRight="40dp"        android:id="@+id/ip_code"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Regist"        android:id="@+id/regist"        android:layout_below="@+id/ip_code"        android:background="#00000000"        android:textColor="#ff6c54"        android:onClick="Click"/>    <ImageView        android:layout_width="match_parent"        android:layout_height="250dp"        android:src="@drawable/smaritan"/>    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/regist"        android:text="Welcome To New World"        android:layout_centerHorizontal="true"        android:textSize="25sp"        android:id="@+id/text1"        android:textColor="#ff526c" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/text1"        android:text="Try To Find A Way Out?"        android:textSize="20sp"        android:layout_centerHorizontal="true"        android:textColor="#ff558d" /></RelativeLayout>

HttpThread.java

public class HttpThread extends Thread {    String url;    String ip_name;    String ip_code;    public HttpThread(String url, String ip_name, String ip_code) {        this.url = url;        this.ip_name = ip_name;        this.ip_code = ip_code;    }    private void doGet(){        //Get()只能通过url传递参数,所以如下处理        //同时像服务器发送中文需要进行转码即:ip_name--->URLEncoder.encode(ip_name,"utf-8")        try {            url = url + "?name=" + URLEncoder.encode(ip_name,"utf-8")+ "&code="   //<*>        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        try {            URL httpUrl = new URL(url);            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();            //设置请求方式            conn.setRequestMethod("GET");            //设置请求超时时间            conn.setReadTimeout(5000);            BufferedReader bufferedReader  = new BufferedReader(new InputStreamReader(conn.getInputStream()));            String str;            StringBuffer sb = new StringBuffer();            while ((str=bufferedReader.readLine())!=null){                sb.append(str);                System.out.println("result:"+sb.toString());            }        }catch (MalformedURLException e) {            e.printStackTrace();        }catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void run() {        doGet();    }}


RegistActivity.java

public class RegistActivity extends Activity {    private EditText ip_name;    private EditText ip_code;    private Button regist;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.regist);        ip_name = (EditText) findViewById(R.id.ip_name);        ip_code = (EditText) findViewById(R.id.ip_code);    }    public void Click(View v){        //手机无法识别localhost(http://localhost:8080/web/MyServlet),所以要改为主机ip地址        String url = "http://192.168.1.100:8080/web/MyServlet";        new HttpThread(url,ip_name.getText().toString(),ip_code.getText().toString()).start();    }}



POST方法传递数据:(发送的数据量较大使用)

HttpThreadPost.java

public class HttpThreadPost extends Thread {    String url;    String ip_name;    String ip_code;    public HttpThreadPost(String url, String ip_name, String ip_code) {        this.url = url;        this.ip_name = ip_name;        this.ip_code = ip_code;    }    @Override    public void run() {        doPost();    }    public void doPost(){        //创建URL对象        try {            URL httpurl = new URL(url);            //创建HttpUrlConnection对象            HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();            conn.setRequestMethod("POST");            //指定超时时间            conn.setReadTimeout(5000);            //获取输出流对象            OutputStream out = conn.getOutputStream();//<*>            //向服务器提交数据(字节)            String content = "name="+ip_name+"&code="+ip_code;//<*>            out.write(content.getBytes());//<*>            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));            StringBuffer sb = new StringBuffer();            String str;            while ((str=bufferedReader.readLine())!=null){                sb.append(str);            }            System.out.println(sb.toString());        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}


RegistActivity.java

public class RegistActivity extends Activity {    private EditText ip_name;    private EditText ip_code;    private Button regist;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.regist);        ip_name = (EditText) findViewById(R.id.ip_name);        ip_code = (EditText) findViewById(R.id.ip_code);    }    public void Click(View v){        //手机无法识别localhost(http://localhost:8080/web/MyServlet),所以要改为主机ip地址        String url = "http://192.168.1.100:8080/web/MyServlet";        new HttpThreadPost(url,ip_name.getText().toString(),ip_code.getText().toString()).start();    }}


从服务器解析Json在客户端显示:

Json:

{    "result": 1,    "personData": [        {            "name": "Shaw",            "age": 28,            "url": "http://www.3dmgame.com/uploads/allimg/150815/300_150815210817_1.png",            "schoolInfo": [                {                    "school_name": "POI"                },                {                    "school_name": "THE MACHINE"                }            ]        },        {            "name": "Root",            "age": 25,            "url": "http://img.rrmj.tv/article/20150504/b_1430724346531.jpg",            "schoolInfo": [                {                    "school_name": "POIi"                },                {                    "school_name": "Smaritan"                }            ]        }    ]}

图片url:

1.http://www.3dmgame.com/uploads/allimg/150815/300_150815210817_1.png

2.http://img.rrmj.tv/article/20150504/b_1430724346531.jpg

网页url:

http://192.168.1.100:8080/web/JsonServlet
客户端:

jsonlayout.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ListView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/listView"        android:layout_weight="1"        /></LinearLayout>

jasonitem.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ImageView        android:layout_width="100dp"        android:layout_height="100dp"        android:id="@+id/photo"        android:layout_alignParentLeft="true"        android:src="@mipmap/ic_launcher"/>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/name"        android:textSize="20sp"        android:text="name"        android:layout_toRightOf="@+id/photo"        android:paddingLeft="10dp"/>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/age"        android:textSize="20sp"        android:text="age"        android:layout_toRightOf="@+id/photo"        android:layout_below="@+id/name"        android:paddingLeft="10dp"/>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/school1"        android:textSize="20sp"        android:text="school1"        android:layout_toRightOf="@+id/photo"        android:layout_below="@+id/age"        android:paddingLeft="10dp"/>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/school2"        android:textSize="20sp"        android:text="school2"        android:layout_toRightOf="@+id/photo"        android:layout_below="@+id/school1"        android:paddingLeft="10dp"/></RelativeLayout>

PersonJson.java:

public class PersonJson  {    private String name;    private int age;    private String url;    private List<SchoolInfoJson>schoolInfo;    //set/get方法    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getUrl() {        return url;    }    public void setUrl(String url) {        this.url = url;    }    public List<SchoolInfoJson> getSchoolInfo() {        return schoolInfo;    }    public void setSchoolInfo(List<SchoolInfoJson> schoolInfo) {        this.schoolInfo = schoolInfo;    }}

SchoolJson.java:

public class SchoolInfoJson {    private String school_name;    public String getSchool_name() {        return school_name;    }    public void setSchool_name(String school_name) {        this.school_name = school_name;    }}

此处PersonJson和SchoolJson可以直接用Android Studio的GsonFormat解析生成。

HttpJson.java:

//此类用作网络请求解析Jsonpublic class HttpJson extends Thread {    private String url;    private Context context;    private ListView listView;    private JsonAdapter jsonAdapter;    private Handler handler;    public HttpJson(String url, ListView listView, JsonAdapter jsonAdapter,Handler handler) {        this.url = url;        this.listView = listView;        this.jsonAdapter = jsonAdapter;        this.handler = handler;    }    @Override    public void run() {        try {            URL httpurl = new URL(url);            HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();            conn.setReadTimeout(5000);            conn.setRequestMethod("GET");            BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(conn.getInputStream()));            StringBuffer sb = new StringBuffer();            String str;            while ((str=bufferedReader.readLine())!=null){                sb.append(str);            }            final List<PersonJson>data = parseJson(sb.toString());            handler.post(new Runnable(){                @Override                public void run() {                    jsonAdapter.setData(data);                    listView.setAdapter(jsonAdapter);                }            });        } catch (IOException e) {            e.printStackTrace();        }    }    private List<PersonJson> parseJson(String json){//<1.12>返回List<PersonJson>数据        try {            JSONObject object = new JSONObject(json);            //将解析内容转换为实体数据<1>            List<PersonJson> persons = new ArrayList<PersonJson>();//<1.1>            //解析Json            int reslut = object.getInt("result");            if (reslut==1){                //创建数组                JSONArray personData = object.getJSONArray("personData");                //遍历                for(int i = 0 ; i < personData.length(); i++){                    PersonJson personObject = new PersonJson();//<1.2>                    //取出数组对应的每一个Json object对象                    JSONObject person = personData.getJSONObject(i);                    String name = person.getString("name");                    int age = person.getInt("age");                    String url = person.getString("url");                    personObject.setName(name);//<1.3>                    personObject.setAge(age);//<1.4>                    personObject.setUrl(url);//<1.5>                    persons.add(personObject);//<1.6>                    JSONArray schoolInfo = person.getJSONArray("schoolInfo");                    List<SchoolInfoJson> schInfos = new ArrayList<SchoolInfoJson>();    //创建一个schoolInfoList的集合<1.7>                    personObject.setSchoolInfo(schInfos);//<1.10>                    for (int j = 0; j < schoolInfo.length(); j ++){                        JSONObject school = schoolInfo.getJSONObject(j);                        String schoolName = school.getString("school_name");                        SchoolInfoJson info = new SchoolInfoJson();//<1.8>                        info.setSchool_name(schoolName);//<1.9>                        schInfos.add(info);//<1.10>                    }                }return persons;//<1.13>返回数据表            }            else {                Toast.makeText(context,"error",Toast.LENGTH_SHORT).show();            }        } catch (JSONException e) {            e.printStackTrace();        }        return null;    }}


HttpImage.java:

//此类用于显示图片public class HttpImage extends Thread {    private String url;    private Handler handler;    private ImageView photo;    public HttpImage(String url, Handler handler, ImageView photo) {        this.url = url;        this.handler = handler;        this.photo = photo;    }    @Override    public void run() {        try {            URL httpurl = new URL(url);            //得到HttpUrlConnection对象            HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();            //设置超时时间            conn.setReadTimeout(5000);            //设置请求方式            conn.setRequestMethod("GET");            InputStream in = conn.getInputStream();            final Bitmap bitmap = BitmapFactory.decodeStream(in);            handler.post(new Runnable() {                @Override                public void run() {                    photo.setImageBitmap(bitmap);                }            });        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}


JsonAdapter.java:

public class JsonAdapter extends BaseAdapter {    private List<PersonJson> list;    private Context context;    //用于初始化布局    private LayoutInflater inflater;    private Handler handler = new Handler();    public JsonAdapter(List<PersonJson> list, Context context) {        this.list = list;        this.context = context;        inflater = LayoutInflater.from(context);    }    public JsonAdapter(Context context){        this.context = context;        inflater = LayoutInflater.from(context);    }    public void setData(List<PersonJson>data){        this.list =data;    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        Holder holder = null;        if(convertView==null){            //初始化布局            convertView = inflater.inflate(R.layout.jsonitem,null);            holder = new Holder(convertView);            convertView.setTag(holder);        }        else {            holder = (Holder) convertView.getTag();        }        //若得到实体数据就设置界面信息        PersonJson person = list.get(position);        holder.name.setText(person.getName());        holder.age.setText(""+person.getAge());        List<SchoolInfoJson>school = person.getSchoolInfo();        SchoolInfoJson schoolInfo1 = school.get(0);        SchoolInfoJson schoolInfo2 = school.get(1);        holder.school1.setText(schoolInfo1.getSchool_name());        holder.school2.setText(schoolInfo2.getSchool_name());        new HttpImage(person.getUrl(),handler,holder.photo).start();        return convertView;    }    class Holder{        private TextView name;        private TextView age;        private TextView school1;        private TextView school2;        private ImageView photo;        //创造其构造方法        public Holder(View view){            //初始化            name = (TextView) view.findViewById(R.id.name);            age = (TextView) view.findViewById(R.id.age);            school1 = (TextView) view.findViewById(R.id.school1);            school2 = (TextView) view.findViewById(R.id.school2);            photo = (ImageView) view.findViewById(R.id.photo);        }    }}


JsonActivity.java:

public class JsonActivity extends Activity {    private ListView listView;    private JsonAdapter jsonAdapter;    private Handler handler =new Handler();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.jasonlayout);        listView = (ListView) findViewById(R.id.listView);        jsonAdapter = new JsonAdapter(this);        String url ="http://192.168.1.100:8080/web/JsonServlet";        new HttpJson(url, listView, jsonAdapter,handler).start();    }}



多线程下载:

TIPS>>>

<1.Http协议字段 Range "bytes="+start+"-"+end

<2.RandomAccessFile设置吸入的位置

<3.开启线程发送网络请求

DownLoad.java

public class DownLoad {    private Handler handler;    public DownLoad(Handler handler){        this.handler = handler;    }    //在本地通过线程池下载对象    private Executor threadPool = Executors.newFixedThreadPool(3);    static class DownLoadRunnable implements Runnable{        private String url;        private String fileName;        private long start;        private long end;        private Handler handler;        //指定构造方法传进数据        public DownLoadRunnable(String url, String fileName, long start, long end, Handler handler) {            this.url = url;            this.fileName = fileName;            this.start = start;            this.end = end;            this.handler = handler;        }        @Override        public void run() {            try {                URL httpUrl = new URL(url);                HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();                conn.setReadTimeout(5000);                //指定数据的长度                conn.setRequestProperty("Range","bytes="+start+"-"+end);                //设置请求方式                conn.setRequestMethod("GET");                //向本地文件写入                RandomAccessFile access = new RandomAccessFile(new File(fileName),"rwd");                //指定位置进行读写                access.seek(start);                //读取数据                InputStream is =conn.getInputStream();                //创建传送区域                byte[] b = new byte[1024*4];                int len = 0;                while ((len = is.read(b))!=-1){                    access.write(b,0,len);                }                if (access!=null){                    access.close();                }                if (is!=null){                    is.close();                }                //更新UI(文件下载完成后向主线程发送一个消息)                Message msg = new Message();                msg.what=1;                handler.sendMessage(msg);            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }    public void downLoadFile(String url){        try {            URL httpUrl = new URL(url);            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();            conn.setReadTimeout(5000);            conn.setRequestMethod("GET");            //获取下载对象总体的长度            int count = conn.getContentLength();            //通过3个线程下载,每个线程下载的长度:            int block = count/3;            String fileName = getFileName(url);            //得到文件名后指定文件下载地址(下载到SD卡)            File parent = Environment.getExternalStorageDirectory();            File fileDownload = new File(parent,fileName);            //向线程池提交任务            for(int i = 0; i < 3; i++){                long start = i*block;                long end  =(i+1)*block-1;                if (i==2){                    end =count;                }                //创建Runnable对象                DownLoadRunnable runnable =new DownLoadRunnable(url,fileDownload.getAbsolutePath(),start,end,handler);                //通过线程池提交任务                threadPool.execute(runnable);            }        }        catch (IOException e) {        }    }    //定义方法取出url后缀名(得到文件名字)    public String getFileName(String url){        return url.substring(url.lastIndexOf("/"+1));    }

DownLoadActivity.java:

public class DownloadActivity extends Activity {    private Button button;    private TextView textView;    private int count = 0;    private Handler handler = new Handler(){        public void handleMessage(Message msg){            int result = msg.what;            count+=result;            if(count==3){                textView.setText("download completed");            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.download);        button = (Button) findViewById(R.id.download);        textView = (TextView) findViewById(R.id.textView);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                new Thread() {                    @Override                    public void run() {                        //添加DownLoad对象                        DownLoad load = new DownLoad(handler);                        String url = "http://192.168.1.100:8080/web/hoby.png";                        load.downLoadFile(url);                    }                }.start();                Toast.makeText(DownloadActivity.this, Environment.getExternalStorageDirectory().toString(), Toast.LENGTH_LONG).show();            }        });    }}







0 0
原创粉丝点击