欢迎光临散文网 会员登陆 & 注册

网络编程

2021-07-07 16:18 作者:独行D暗灵  | 我要投稿

网络编程简介、基于TCP协议的网络通信

网络编程简介

  • Android中常用的网络编程有如下几种方式:

    • 针对TCP/IP协议的Socket和ServerSocket

    • 针对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进行网络通信的具体步骤︰

    1. 根据指定端口实例化一个ServerSocket对象

    2. 调用ServerSocket对象的accept()方法接收客户端发送的Socket对象

    3. 调用Socket对象的getInputStream()/getOutputStream()方法建立与客户端进行交互的IO流

    4. 服务器与客户端根据一定的协议进行交互,直到关闭连接

    5. 关闭服务器端的Socket

    6. 回到第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() {});//此处省略回调方法。
       





网络编程的评论 (共 条)

分享到微博请遵守国家法律