网络编程入门

HTTP协议简介

日常生活中,大多数人遇到了问题都会使用手机进行百度搜索,在浏览器的地址栏中输入百度的网址点击搜索,就会进入百度主页。这个访问百度的过程就是HTTP协议完成的,HTTP即超文传输协议,它规定了浏览器和服务器之间相互通信的规则,这里说的浏览器,既包括PC端浏览器,又包括移动端浏览器。

当客户端与服务器建立连接后,向服务器发送的请求,我们称之为HTTP请求。服务器接收到客户端请后并做出响应,我们称之为HTTP响应。

HTTP请求为分三部份:请求行,请求头,请求体/实体内容/正文内容

HTTP响应为分三部份:响应行,响应头,响应体/实体内容/正文内容

         HTTPS


Handler消息机制原理

在Android4.0以后的版本中,不能在主线程(UI线程)中访问网络,子线程也不能更新UI界面,即

界面由主线程(UI线程)来更新,访问网络的工作交由子线程完成。这时就需要用到Handler消息机制来

实现主子线程之间的通信。

Handler消息机制中,关键有四个对象,我们需要理解其原理。

1——Message【重点】:

Messgae是在线程之间传送的消息,它可以在内部携带少量的信息,用于在不同线程之间

交换数据,Message的what子段表示携带了什么类型的信息,obj字段表示携带一个Object对象

2——Handler【重点】【重点】:

Handler就是消息处理者,它主要用于发送消息和处理消息。一般使用Handler对象

的sendMessage()方法发送消息,发出的消息经过一系列处理,最终会传递到Handler对象的handleMessage()方法中,再分门别类的处理

3——MessageQueue:

MessageQueue是消息队列的意思,它主要用来存放通过Handler.sendMessage()方法发送的消息,

通过Handler发送的消息会存入MessageQueue中等待处理,每个线程中只会有一个MessageQuery对象

4——Looper:

    Looper是每个线程中的MessageQueue的管家,每当发现MessageQueue中存在一条消息,

就会将它取出,并传递到Handler的handleMessage()方法中。每个线程也只会有一个Looper对象。

一个线程只有一个MessageQueue对象,一个MessageQueue也只有一个Looper对象

8.2 使用HttpURLConnection访问网络

8.2.1 HttpURLConnection基本用法

在实际开发中,大多数的App都需要与服务器进行数据交互,这时我们可以使用Java标准类

HttpURLConnection来实现。

URL url = new URL(“http://www.baidu.com”);

HttpURLConnection conn= (HttpURLConnection)url.openConnection();

conn.setRequestMethod(“GET”);

conn.setConnectionTimeout(5000);如果不设置超时时间的话,在网络异常时,会取不到数据而一直等待

Int code = conn.getResponseCode();

//获取HTTP响应码,如果是200的话

InputStream is = conn.getInputStream();

try{

//读取流信息,获得服务器返回的数据

}catch(){

}

conn.disconnection();

注意:Android中,访问网络需要在android清单文件中配置权限:

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

8.3 数据提交方式

8.3.1 GET方式和POST提交数据到服务器

1——GET方式

GET方式会将数据添加到URL后面,用?分隔,用&拼接每个请求参数,例如:

http://127.0.0.1:8080/web/LoginServlet?id=2016&name=runsin&gender=male

HTTP协议规定GET方式请求长度不超过4K,但IE规则GET方式请求长度不超过1K,

所以为了达到兼容,GET方式请求长度最多不超过1K,中文要编码

conn.setRequestMethod(“GET”);

2——POST方式

POST方式将数据隐藏在HTTP请求的实体中,以输入流的方式提交给服务器,相对GET来说,

POST方式请求长度是没有限制的,中文要编码

conn.setRequestMethod(“POST”);

conn.setRequestProperty(“content-type”,”application/x-www-form-urlencoded”);

conn.setRequestPropety(“content-length”,”100”);

conn.setDoOutput(true);

outputStream os = conn.getOutputStream();

os.write(data.getBytes(“UTF-8”));

int code = conn.getResponseCode();

if(code == 200){

//读取服务器返回的信息

}else{

//向主线程(UI线程)发送消息,让主线程(UI线程)显示出错提示给用户看

}

JSON解析

 什么是JSON

    有着特殊格式的普通字符串

    为什么要用JSON,XML占用较多的带宽资源,速度慢,如果XML书写错误,会造成解析失败

    项目中JSON用在哪

      在服务器和移动客户端之间传递数据,通常是服务器将JSON传递给移动客户端,移动客户端再解析出JSON中有用的数据加以使用

    移动客户端如何解析JSON

     {}表示JSONObject对象

    []表示JSONArray对象

综合练习Android + JSON + JavaEE + MySQL

使用HttpClient访问网络

HttpClient基本用法

   Android平台中,提供了三种网络接口,它们分别是:

》java.net.*(Java标准接口)

》org.apache.*(Apache接口)

》android.net.*(Android网络接口)

GET:

1_创建HttpClient对象

2_创建HttpGet对象

3_如果需要发送请求参数,可以直接将要发送的参数连接到URL后面,中文要编码

4_调用HttpClient对象的execute(HttpGet对象)方法发送请求,

返回值是一个HttpResponse对象

5_调用HttpResponse对象的getEntity()方法获取响应结果的HttpEntity对象

6_调用HttpEntity对象的方法获取结果,EntityUtils是一个不错的工具类

POST:

1_创建HttpClient对象

2_创建HttpPost对象

3_如果需要发送请求参数,

   先将所有参数用List<NameValuePair> params = new ArrayList<NameValuePair>()封装,

   再加入params.add(new BasicNameValuePair("country",country))中

   最后调用setEntity(new UrlEncodedFormEntity(params,"UTF-8")进行编码

4_调用HttpClient对象的execute(HttpPost对象)方法发送请求,返回值是一个HttpResponse对象

5_调用HttpResponse对象的getEntity()方法获取响应结果的HttpEntity对象

6_调用HttpEntity对象的方法获取结果,EntityUtils是一个不错的工具类