网络编程
网络编程简介、基于TCP协议的网络通信
网络编程简介
Android中常用的网络编程有如下几种方式:
针对HTTP协议的网络编程,如HttpURLConnection或HttpClient直接使用WebKit访问网络
基于TCP协议的网络通信
通信协议核心要素︰
语义
语法
时序
TCP/IP通信协议是一种可靠的、双向的、持续的、点对点的网络协议
基于TCP协议的网络编程主要使用以下Socket :
ServerSocket:服务器套接字
Socket:客户端套接字
常用的Socket的构造方法︰
上述两个Socket构造方法都声明抛出IOException异常,因此在创建Socket对象必须捕获或抛出异常。最好选择注册端口(范围是1024~49151的数),通常应用程序使用这个范围内的端口,以防止发生冲突。
Socket(String host,int port)
Socket (String host,int port,InetAddress localAddr,int localPort)
ServerSocket类常用构造方法︰
ServerSocket类的构造方法都声明抛出IOException异常,因此在创建ServerSocket对象时必须捕获或抛出异常。另外,在选择端口号时,最好选择注册端口(范围是1024~49151的数),通常应用程序使用这个范围内的端口,以防止发生冲突。
ServerSocket(int port)
ServerSocket(int port,int backlog)
ServerSocket(int port,int backlog,InetAddress localAddr)
使用ServerSocket进行网络通信的具体步骤︰
根据指定端口实例化一个ServerSocket对象
调用ServerSocket对象的accept()方法接收客户端发送的Socket对象
调用Socket对象的getInputStream()/getOutputStream()方法建立与客户端进行交互的IO流
服务器与客户端根据一定的协议进行交互,直到关闭连接
关闭服务器端的Socket
回到第2步,继续监听下一次客户端发送的Socket请求连接
URL和URLConnection
Get与Post两种方式提交服务端数据
Get方式提交数据
new Thread ( ){
override
public void run () {
response=GetPostUtil.sendGet (
"http ://172.20.1o.11:8888/ api/ getInfo","userName=abc&password=123") ;
/l/发送消息通知uI线程更新uI组件
handler.sendEmptyMessage ( 0x123) ;
)
}.start ( );
Post方式提交数据
new
Thread() {
@override
public void run() {
response=Get Postutil . sendPost ("http://
172.20.10.11 : 8888/api /postInfo",
"use rName=admin &password=123") ;
/ /发送消息通知∪I线程更新uI组件
handler . sendEmptyMessage (0x123) ;
} .start () ;
HttpURLConnection
获取HttpURLConnection对象
设置HttpURLConnection属性
释放HttpURLConnection对象
Gson库的使用
Gson是一个Java库,作用是将Java对象转换成它对应的JSON表示
使用Gson.toJson(...)方法来进行序列化操作
使用Gson.fromJson(...)方法来进行反序列化操作
对象的字段可以并推荐使用private
无需使用注解指定哪些字段被包括在序列化和反序列化操作中。当前类,和它所有父类的所有字段都是默认包括的。
如果字段使用transient修饰,它被默认忽略
Gson可以正确处理null值。
序列化时,值为null的字段会被跳过。
反序列化时,JSON中缺失的项,其对象对应的字段会被设为null。内部类、匿名类等隐含的外部类的字段不包含在序列化和反序列化中。
Volley框架
Volley框架是Google发布的基于Android平台的网络通信库
适合进行数据量不大、通信频繁的网络操作
Volley提供以下几个功能:
JSON、图像等资源的异步下载
网络请求的排序及优先级处理
缓存和多级别取消请求
与Activity生命周期联动,Activity生命周期结束时取消所有的网络请求
Volley在性能方面适合数据量不大、通信频繁的网络操作﹔而对于大数据量的网络操作,例如文件下载等,Volley的性能表现则非常糟糕。
使用Volley框架前,需要将Volley.jar文件导入到项目中
使用Volley框架实现网络数据请求,主要有三个步骤︰
创建RequestQueue对象
创建xxxRequest对象
将xxxRequest对象添加到RequestQueue中
OkHttp第三方网络库
OkHttp是一个第三方类库,用于android中请求网络。
OkHttp是一个开源项目,是安卓端最火热的轻量级框架,由移动支付square公司贡献(该公司还贡献了Picasso和LeakCanary ) 。
OkHttp用于替代HttpUrlConnection和ApacheHttpClient(android API23里已移除HttpClient)。
OkHttp官网: http://square.github.io/okhttp/
OkHttp源码github地址: ( https://github.com/square/okhttp)
OkHttp在3.13.x以上的版本需要在Android 5.0+(API level 21+)和Java 1.8的环境开发。okHttp在3.12.x以及以下的版本支持Android 2.3+(API level 9+)和Java 1.7的开发环境
OkHttp3开发三部曲︰
创建OkHttpClient,添加配置
创建请求
执行请求
创建OkHttpClient
一个最简单的OkHttpClient
okHttpClient okHttpClient=new OkHttpclient. Builder ( ) .build( );
一个复杂点的OkHttpClient配置
File cacheDir = new File(getcacheDir(), "okhttp_cache" ) ;Cache cache = new Cache (cacheDir,10 * 1024 * 1024);
okHttpclient = new OkHttpclient.Builder ()
.connectTimeout (5*1000,TimeUnit.MILLISECONDS)//链接超时.readTimeout ( 10*1000 , TimeUnit.MILLISECONDS)//读取超时.writeTimeout (10*1000 , TimeUnit.MILLISECONDS)//写入超时
.addInterceptor (new HttpHeadInterceptor())//应用拦截器:统一添加消息头.addNetworkInterceptor(new NetworkspaceInterceptor() )//网络拦截器
.addInterceptor (loggingInterceptor)//应用拦截器:打印日志
.cache (cache)//设置缓存
.build ( ) ;
创建请求
GET请求
Request req = new Request.Builder ( ) .url(url) .build ( );Call call =okHttpclient .newCall (req);
普通POST请求(JSON请求)
RequestBody requestBody =
RequestBody.create (MediaType.parse ( "application/json"),jsonobject.toString () ) ;
Request req = new Request.Builder ( ) .url(url)
.post (requestBody)
.build () ;
call call = okHttpclient .newCall (req) ;
使用FormBody传递键值对参数
RequestBody requestBody =
new FormBody . Builder ()
.add ( "username" , "zhangsan").add ( "password", "1111111"").build ( ) ;
Request req = new Request.Builder ().url(url) .post (requestBody) .build();Call call =okHttpClient.newCall (req) ;
使用RequestBody传递Json对象
OkHttpClient client = new OkHttpclient();//创建okHttpclient对象。//数据类型为json格式,
MediaType JSON = MediaType.parse ( "application/json; charset=utf-8");lljson数据.
string jsonstr = "{ \"username \ ": \"lisi\ ", \"nickname \ ": \"李四\")";RequestBody body = RequestBody.create(JSON,josnstr) ;
Request request = new Request.Builder ()
.url ( "http: / / www.baidu . com").post (body)
.build ( ) ;
client.newCall (request).enqueue (new callback ( ){
});//此处省略回调方法。
使用RequestBody传递File对象
//创建okHttpclient对象。
OkHttpclient client = new OkHttpclient () ;//数据类型为json格式,
MediaType fileType = MediaType.parse ("File/*");File file = new File ( "path" );/lfile对象.
RequestBody body = RequestBody.create (fileType , file );Request request = new Request.Builder ()
.url ( "http : / / www . baidu .com").post (body)
.build ( ) ;
client.newcall(request).enqueue (new callback() {});//此处省略回调方法。