一、什么是WebSocket
WebSocket
是HTML5
下一种新的协议(WebSocket
是一种在单个TCP
连接上进行全双工通信的协议)。
WebSocket
使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。
在WebSocket
API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket
是一个持久化的协议
二、WebSocket的原理
很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP
请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP
请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
而比较新的技术去做轮询的效果是Comet
。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet
中,普遍采用的长链接,也会消耗服务器资源。
在这种情况下,HTML5
定义了WebSocket
协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
它约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp
的连接,从而方便它们之间的通信。
在WebSocket
出现之前,web
交互一般是基于HTTP
协议的短连接或者长连接。
WebSocket
是一种全新的协议,不属于HTTP
无状态协议,协议名为“ws
“
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
websocket = initWebSocket()
console.log(websocket);
} else {
alert('当前浏览器 Not support websocket')
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function() {
closeWebSocket();
}
//初始化
function initWebSocket() {
websocket = new WebSocket("ws:\\192.168.65.26:4000/msgws/112"); // 本地环境
//连接发生错误的回调方法
websocket.onerror = function() {
setMessageInnerHTML("WebSocket连接发生错误");
};
//连接成功建立的回调方法
websocket.onopen = function() {
setMessageInnerHTML("WebSocket连接成功");
};
//接收到消息的回调方法
websocket.onmessage = function(event) {
setMessageInnerHTML(event.data);
};
//连接关闭的回调方法
websocket.onclose = function() {
setMessageInnerHTML("WebSocket连接关闭");
};
return websocket
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
var message = "hello world";
websocket.send(message);
}
三、WebSocket与HTTP的关系
相同点:
- 都是基于
tcp
的,都是可靠性传输协议 - 都是应用层协议
不同点:
WebSocket
是双向通信协议,模拟Socket
协议,可以双向发送或接受信息HTTP
是单向的WebSocket
是需要浏览器和服务器握手进行建立连接的- 而
HTTP
是浏览器发起向服务器的连接,服务器预先并不知道这个连接
联系:
WebSocket
在建立握手时,数据是通过HTTP
传输的。但是建立之后,在真正传输时候是不需要HTTP
协议的
四、总结(总体过程):
首先,客户端发起HTTP
请求,经过3次握手后,建立起TCP
连接;HTTP
请求里存放WebSocket
支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
然后,服务器收到客户端的握手请求后,同样采用HTTP
协议回馈数据;
最后,客户端收到连接成功的消息后,开始借助于TCP
传输信道进行全双工通信。