HTTP和WEBSOCKET是现在主流的两个网络协议,下面我们对其进行介绍和比较。
HTTP(S)协议
HTTP(S): Hypertext Transfer Protocol (Secure), (安全)超文本传输协议。HTTP和HTTPS的主要区别是HTTPS传输数据时是加密的,而HTTP不加密,所以下面我们都以HTTP来进行讲解。
HTTP协议定义了客户端与服务器之间的通信内容及交互方式。客户端与服务器之间以请求,响应的方式进行交互,即由客户端向服务器端发出请求消息,服务器收到请求消息后执行客户请求并返回请求数据。
其中请求消息包含两部分:请求什么资源, 进行什么操作。
-
请求什么资源,即具体访问服务器的哪个文件或者程序。这个是通过URL(统一资源定位符)指定的,其格式如下:
http: + // + Web服务器名 + / + 访问文件目录 + / + 文件名
http: 表示以 http 协议访问Web服务器,// 后面是服务器域名,域名后面是要访问资源在服务器的具体路径。
如, http://api.mixin.one/network/snapshots/8f5b244e-cf86-4374-8eaa-c551fd70cd83
表示通过http协议,访问 api.mixin.one服务器上面的文件"network/snapshots/8f5b244e-cf86-4374-8eaa-c551fd70cd83"。其在服务器上面的存储路径名为:network/snapshots/8f5b244e-cf86-4374-8eaa-c551fd70cd83。
其中文件名可以省略,如果省略则会访问服务器事先设置的默认文件。 -
进行什么操作,即希望服务器完成什么样的操作。HTTP协议定义了很多方法用来向服务器发出请求。其中最常用的是GET和POST 两种方法。
-
GET, 返回URL指定的信息,如果URL指定的是具体文件,则返回该文件内容,如果指定的是某个程序,则返回改程序的执行结果。
通过GET方法发送请求时,可以在URL的后面附加一些参数一同发给服务器。
其格式为 URL?key1=value1&key2=value2 key为参数名,value为参数值,参数之间以&隔开,参数和URL之间以'?' 隔开
如,我们想从MIXIN获取2018-05-29号0点之后的10条快照,其命令如下:
"https://api.mixin.one/network/snapshots?limit=10&offset=2018-05-29"
其中 URL为"https://api.mixin.one/network/snapshots", 参数为limit,offset,参数的值依次为10, 2018-05-29 -
POST, 从客户端向服务器端发送数据。
当有大量数据需要发送给服务器,或者数据中包含敏感数据时通常通过POST方法发送。
POST发送请求时,其数据的发送形式与GET不同。POST是以--data参数的形式来发送数据。
如,当我们向某个用户转账时,需要将具体的转账金额,收账人等信息发送给服务器,其形式如下:
curl "https://api.mixin.one/transfers" -X POST --data '{"amount":"10","asset_id":"43d61dcd-e413-450d-80b8-101d5e903357","counter_user_id":"a465ffdb-4441-4cb9-8b45-00cf79dfbc46","memo":"hello","pin":"F39IsJmUaZW03VMV/01lHyY2RCoZ7/X764akX+EmthIc4uVsWAWQTM/IxX5Z9C1y","trace_id":"7c67e8e8-b142-488b-80a3-61d4d29c90bf"}'
这里我们注意到,其实GET, POST都可以向服务器发送数据,只是GET方式是将数据直接拼接到了URL后面;POST则是以--data参数的形式来发送数据。两种方式都可以讲参数发送给服务器,但参数所在的位置不同。当执行http命令时,应用程序会按照http协议规定的数据格式将客户端的请求命令格式化,并发送出去。被格式化后的请求消息消息包括消息头和消息体。以GET方法发送的数据是放在消息头里面的,且对外部是可见的,即在网络中可以被他人读取;以POST方法发送的数据放在消息体里面,在网络中不可见, 即不容易被窃取。还有就是消息头有固定大小,通常只有几百个字节,因此GET方法能发送的数据量是有限的,POST则没有数据量大小的限制。
-
WebSocket (Secure) 协议
WebSocket是基于HTTP发展而来的网络协议。它和HTTP协议最大的不同是,HTTP协议是以客户端请求,服务器响应的方式来进行交互,这种交互方式的缺点是服务器无法主动向客户端推送新数据。而通过WebSocket 协议,服务器和客户端均可以主动向对方发送数据。
URL以ws(s)开头,则表示以 WebSocket 协议的形式进行数据交换。
WebSocket是有状态的,即客户端与服务器之间建立连接之后,彼此都保存了对方的状态,因此每次发送数据时不需要发送上下文信息。
-
WebSocket API
WebSocket提供了一组API来方便WebSocket协议的使用。
WebSocket API是事件驱动的,服务器和客户端之间通过触发事件和响应事件的方式来沟通。
下面对webSocket主要的事件,方法,属性进行介绍:- WebSocket 事件
WebSocket有四种事件:Open, Message, Error, Close.
四个事件对应的句柄分别为onOpen, onMessage, onError, onClose.
程序可以给每个句柄赋值回调函数
当事件发生时,对应的回调函数就会被执行。
如当连接建立成功时,onOpen回调函数就会被执行
当有消息到达时,onMessage回调函数就会被执行;
当有异常发生时,onError回调函数就会被执行;
当连接断开时,onClose回调函数就会被执行。 - webSocket 方法
WebSocket有两个方法:- send() 发送消息.
连接建立以后,可以通过send方法来发送数据 - close() 关闭连接。
数据发送完之后,可以通过调用close来关闭连接。
- send() 发送消息.
- WebSocket 属性
WebSocket 有三个常用属性: - readyState webSocket连接当前的状态:
- WebSocket.CONNECTING(0) 表示正在连接
- WebSocket.OPEN(1) 表示连接已建立
- WebSocket.CLOSING(2) 表示连接正在关闭
- WebSocket.CLOSED(3) 表示连接已关闭
- WebSocket 事件
-
bufferedAmount 缓存区数据大小
当调用send()发送数据时,数据其实不是马上通过网络发送出去,而是缓存在应用系统的buffer中,当buffer满的时候一起发送出去,从而提高网络利用率。我们可以通过属性buffererAmout的值来查看buffer中已存在数据的大小。 -
protocol 协议。
WebSocket支持多种数据传输协议,也支持用户自己建立的协议。在建立连接时可以指定使用哪种协议来传输数据。
网友评论