Android | Socket & Https(Java&Android)原理及API使用架构概述

  • Socket两种通道模型:
    • TCP:可持续性地输送数据,注意使用
    • UDP:无连接,UDP是一个不可靠的协议, 发送方所发送的数据报并不一定以相同的次序到达接收方。
  • 这里详见另外一篇博客;
  • HTTP与Socket通信的区别
    • HTTP是位于应用层的协议, Socket对应的是传输层(TCP/UDP)
    • HTTP已经基本可以满足大部分情况下与Server端的数据交互,为何还要写Socket通信?
      • HTTP是一个应用层的协议, 我们针对这个协议已经定义了很多通信的规范, 比如请求体、响应体、请求头等;
      • HTTP是一个无状态的协议, 比如通过浏览器访问百度, 访问之后百度会把网页数据传给浏览器, 浏览器渲染完成,通信结束; 无状态协议是指比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登录该网站,但是服务器并不知道客户关闭了一次浏览器, 无状态服务器是指一种把每个请求作为与之前任何请求都无关的独立的事务的服务器
      • 服务端推送场景: HTTP很难实现, 由服务端发起、客户端接收的能力;
      • 移动端通信,传输数据时, 移动端期望传输效率尽可能要高, 消耗的流量尽可能要少; 假设我们要发送几个字符, 如果我们要通过HTTP协议去发送的话, 就需要按照HTTP的规范,将要发送的数据进行封装, 而在发送过程中,数据包就会变大非常多; 而使用Socket的话, 我们可以自己定义一些非常简单的协议—— 有可能我们发送一个内容的时候, 数据体只要有一个目标目的地,再加上一个内容即可, 也即数据的大小会小很多,灵活性会高些;
      • 小结: HTTP是应用层的协议,已经有明确、完善的需要遵循的规范; Socket位于底层,更加灵活,方便定制, 能够提供Server端主动向客户端通信的能力;
  • UDP
  • UDP传输机制,类似于写信的方式—— 每次传输把要传输的数据一次性封装起来(写进一封信), 传送给目标, 目标打开数据封装(打开信封),阅读数据, 完毕后考虑是否要回复(回信);
  • 不可靠通信,不知道对方是否能接收到;
  • 下面看图解:
  • ip:定位到机器; port:定位到机器上的某个服务程序; 确认了,拿到ip和port,就相当于有了目标程序的接收地址, 接下来就可以把要发送的数据进行封装(写好东西装信封), 封装类DatagramPacket
  • 把数据封装成一个Packet之后, Client调用send,将数据包发送给Server, Server收到之后, 通过DatagramPacket解析数据得到数据体, 解析完了,可以选择回复(或者不回复), 回复时同样用DatagramPacket封装数据而后发送;
  • 对于Java层或者Android上的API, UDP ClientUDP Server都是DatagramSocket类; IP和端口号相关的是类InetAddress 数据发送操作相关类是DatagramPacket
  • 通信流程: Server处于Socket的receive状态, 期待接收消息; Client把需要发送的消息封装成DatagramPacket, 然后根据Server的ip和port(InetAddress)找到目标程序, 把DatagramPacket就send过去; Server拿到Packet之后进行解析和阅读, 阅读完毕后考虑给Client回复发送Packet;
  • TCP
  • 如果要打个比方的话, UDP类似于写信的方式的话, TCP则是类似于打电话的方式, 一旦连接完成之后就可以进行不间断的通信, TCP是一个比较安全的协议, 确保接收方一定能收到数据;

下面看图解:

  • TCP Client对应的API是Socket, TCP Server对应的是ServerSocket;
  • 同样的,Client端向Server发送数据前, 首先要知道Server的ip和port, 去定位到Server机上接收信息的程序,
  • Client和Server通信, 一旦连接成功,会形成一个全双工通道, 通信双方都会拿到对方的IO流, 可以彼此任意发送数据(图片、字符串等), 当然图片和字符串等数据在具体的通信过程中, 都会在底层转换成二进制流; 所以如Client向Server发送数据时, 就拿着Server端的输出流(outputStream)去写数据, 比如写入图片二进制、字符串等; 反过来Server向Client发送数据时, 则就拿着Client端的输出流(outputStream)去写数据, Client读取Server数据, 实际上就是拿到Server的输入流(inputStream)去读(read), Server同理;

Https

  • 相关API
    • HttpsURLConnection
    • X509Certificate
    • KeyStore
    • SSLSocketFactory
    • ...

Https比Http多了一层证书机制, 证书相关的API如X509Certificate、KeyStore、SSLSocketFactory等;

  • 正确访问https页面的姿势
    • 很多时候开发人员的在访问https页面的时候, 比如项目一开始全部使用http,忽然有一天要用到https的时候, 经常为了自己的开发效率,或者就为了能访问到数据, 大多数的时候会选择忽视证书的校验以及域名类的校验, 即默认访问的https网页都是安全通过的, 这样做确实能够正常交互并拿到数据, 但这么做也就失去了https的意义, 也就是你不在乎Server端给你发的证书是真是假;
    • 正确的做法, 应该是要去验证证书,校验域名。

参考自,慕课网。就业班

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SpringBoot 核心技术

RESTful规范Api最佳设计实践

RESTful是目前比较流行的接口路径设计规范,基于HTTP,一般使用JSON方式定义,通过不同HttpMethod来定义对应接口的资源动作,如:新增(POST...

15300
来自专栏FreeBuf

一款功能强大的开源Web应用程序授权爬行和扫描工具

AuthCov是一款功能强大的开源Web应用程序授权爬行和扫描工具,AuthCov可以使用一个Chrome无头浏览器来爬取你的目标Web应用程序(以预定义的用户...

9800
来自专栏相约机器人

使用Tensorflow进行实时移动视频对象检测

随着对计算机视觉的用例日益增长的兴趣,例如无人驾驶汽车,面部识别,智能交通系统等,人们希望建立定制的机器学习模型以检测和识别特定对象。

15900
来自专栏Lemon黄

【译】现代化的PHP开发--PDO

源/https://www.startutorial.com/articles/view/modern-php-developer-pdo

8400
来自专栏WebJ2EE

Spring周边:StringTokenizer

JDK 已经不建议在新代码中使用 StringTokenizer 了,建议使用正则表达式功能替换;

10900
来自专栏媒矿工厂

OMAF4CLOUD:启用标准的360°视频创建服务

原标题:OMAF4CLOUD: STANDARDS-ENABLED 360° VIDEO CREATION AS A SERVICE

19500
来自专栏前端达人

Vue 3 源码导读

https://juejin.im/post/5d977f47e51d4578453274b3 来源:掘金

33000
来自专栏IT那个小笔记

Spring-JDBC

Spring提供了很多的模板用于简化开发,有基础的JDBC模板相当于DBUtils,使用Hibernate也有简化使用Hibernate的模板

8400
来自专栏相约机器人

大牛出品:TensorFlow 2.0入门指南

前几天,TensorFlow 2.0正式发布。如果你对新的深度学习框架还不熟悉,推荐看看这篇集简介、速成课程、API速查参考为一体的Overview。

8800
来自专栏FreeBuf

AuthCov:Web认证覆盖扫描工具

AuthCov使用Chrome headless browser(无头浏览器)爬取你的Web应用程序,同时以预定义用户身份进行登录。在爬取阶段它会拦截并记录AP...

9700

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励