HTTP通信

什么是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:

//此类用作网络请求解析Json
public 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();
            }
        });
    }
}







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值