Android的网络编程的分类
1.基于http协议的
2.基于socket的
基于TCP/IP协议之上的协议
一、HTTP协议
1.HTTP简介
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。
2.HTTP协议的主要特点
1.支持C/S(客户/服务器)模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3.HTTP的请求方法
HTTP请求方法有8种,分别是GET、POST、DELETE、PUT、HEAD、TRACE、CONNECT 、OPTIONS。其中PUT、DELETE、POST、GET分别对应着增删改查,对于移动开发最常用的就是POST和GET了。
1.GET:请求获取Request-URI所标识的资源
private void get(String url){
//构造Request
Request request = new Request.Builder().url(url)
.header(“User-Agent”, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 " +
“(KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36”)
.addHeader(“Accept”,“application/json”)
.get()
.method(“GET”,null)
.build();
2.POST:在Request-URI所标识的资源后附加新的数据
private void post(String url,Map<String,String> params){
RequestBody body = setRequestBody(params);
//构造Request
Request request = new Request.Builder().url(url).post(body)
.header(“User-Agent”, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 " +
“(KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36”)
.addHeader(“Accept”,“application/json”)
.build();
3.HEAD:请求获取由Request-URI所标识的资源的响应消息报头
4.PUT: 请求服务器存储一个资源,并用Request-URI作为其标识
5.DELETE :请求服务器删除Request-URI所标识的资源
6.TRACE : 请求服务器回送收到的请求信息,主要用于测试或诊断
7.CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
8.OPTIONS :请求查询服务器的性能,或者查询与资源相关的选项和需求
4.HTTP的执行
1.创建一个URL对象
比如:URL url = new URL(http://www.taobao.com);
2.利用HttpURLConnection对象从网络中获取网页数据
比如:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3.设置连接超时
比如:conn.setConnectTimeout(9*1000);
4.对响应码进行判断
比如:if (conn.getResponseCode() != 200) //从Internet获取网页,发送请求,将网页以流的形式读回来
throw new RuntimeException(“请求url失败”);
5.得到网络返回的输入流
InputStream is = conn.getInputStream();
String result = readData(is, “GBK”); //文件流输入出文件用outStream.write;
conn.disconnect();
总结:
记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作。
返回的响应码200,是成功。
在Android中对文件流的操作和JAVA SE上面是一样的。
在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上。
操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到。
对文件流操作完,要记得及时关闭。
二、基于socket的用法
服务器端:
先启动一个服务器端的socket : ServerSocket svr = new ServerSocket(8989);
开始侦听请求:Socket s = svr.accept();
取得输入和输出:DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
Socket 的交互通过流来完成,即是说传送的字节流,因此任何文件都可以在上面传送。谁打开的记得要关上。
用DataInputStream/DataOutputStream来进行包装是因为我们想要他们对基本数据类型的读写功能readInt(),writeInt(),readUTF(),**writeUTF()**等等。
客户端:
发起一个socket连接:Socket s = new Socket(“192.168.1.200”,8989);
取得输入和输出:DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
之后就可以相互通信了。谁打开的记得要关上。