Android | Socket & Https(Java&An

作者: 凌川江雪 | 来源:发表于2019-10-27 15:12 被阅读0次
    • Socket两种通道模型:

      • TCP:可持续性地输送数据,注意使用
      • UDP:无连接,UDP是一个不可靠的协议,
        发送方所发送的数据报并不一定以相同的次序到达接收方。
    • 这里详见另外一篇博客Android网络 | Socket(Eclipse--Java)

    • 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端给你发的证书是真是假;

      • 正确的做法,
        应该是要去验证证书,校验域名。





    参考自,慕课网。就业班

    相关文章

      网友评论

        本文标题:Android | Socket & Https(Java&An

        本文链接:https://www.haomeiwen.com/subject/stvuvctx.html