WebSocket
Websocket协议是基于TCP的一种新的网络协议,他实现了浏览器与服务器全双工通信,允许服务器主动发送信息给客户端,实现了浏览器与服务器全双工通信,属于长连接(不同于HTTP)
最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,
已有 HTTP 协议,为什么还需要websocket协议?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
传统的情况下,双工通信是通过多个HTTP链接来实现,这导致了效率低下,,而websocket正是解决了这个问题。
实现原理:
在websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应(此过程为握手),这样两者之间只需要一个握手动作就可以形成一个快速通道,直接传输数据。Websocket为实现即时服务提供:
1. Header
互相沟通的Header是很小的-大概只有 2 Bytes
2. Server Push
服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。
特点:
1)建立在TCP协议上,服务器端的实现比较容易
2)与HTTP协议有着很好的兼容性80和443端口
3)数据格式比较轻量级,性能开销少,通信高效
4)可以发送文本也可以发送二进制数据
5)客户端可与与任意服务器通信
6)协议的标识符是ws,加密后是wss,服务器网址就是URL
HTML5 Web Socket API编辑
创建对象
var ws = new WebSocket(url,name);///url为WebSocket服务器的地址,name为发起握手的协议名称,为可选择项。
发送文本消息
ws.send(msg);msg为文本消息,对于其他类型的可以通过二进制形式发送。
接收消息
ws.onmessage = (function(){...})();
错误处理
ws.onerror = (function(){...})();
关闭连接
ws.close();
建立 WebSocket 连接
为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
什么是长连接、短连接???
短连接:
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接:
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
HTTP1.1通过使用keep-alive进行长连接双方并没有建立正真的连接会话,服务端可以在任何一次请求完成后关闭,但是对每个请求仍然要单独发 header,Keep-Alive不会永久保持连接,它有一个保持时间,伪连接
WebSocket 它本身就规定了是正真的、双工的长连接,两边都必须要维持住连接的状态。长连接第一次tcp链路建立之后,后续数据可以双方都进行发送,不需要发送请求头。