HTTP/1.0中大多实现为每个请求/响应交换使用新的连接
HTTP/1.1中一个连接可用一次或多次请求/响应交换
HTTP协议中,服务端不能主动联系客户端,只能由客户端发起
webSocket服务器和客户端均可主动发送数据
WebSocket对象提供了一组API,用于创建和管理WebSocket连接,以及通过连接发送的接收数据
WebSocket其实是一个新协议,根HTTP协议基本没关系,只是为了兼容现有浏览器的握手规范而已,
借用了HTTP的协议来完成握手。再送发数据时就不需要HTTP协议了。
建立接连的握手
当Web应用程序用new WebSocket(url)接口时,浏览器就开始与地址为url的服务器建立握手连接的过程
1.浏览器与WebSocket服务器通过TCP握手建立连接,如果这个建立连接失败,那么后面的过程就不会执行,
Web应用程序将收到错误消息通知
2.在TCP建立连接成功后,浏览器通过http协议传送WebSocket支持的版本号,协议的字版本号,原始地址,
主机地址等一系列字段给服务器端
3.WebSocket服务器收到浏览器发送来的请求后,如果数据包数据和格式正确,客户端和服务器端的协议版本号匹配等,
就接受本次握手连接,并给出相应的数据回复,同样回复的数据包也是采用http协议传输。
4.浏览器收到服务器回复的数据包后,如果数据包内容 格式 都没有问题,就表示本次连接成功,触发onopen消息,
此时Web 开发者就可以在此时通过send借口向服务器发送数据;否则握手连接失败,Web应用程序会收到onerror消息,
并知道连接失败的原因。
WebSocket优点
客户端与服务器都可以主动传送数据给对方
不用频率创建TCP请求及销毁请求,减少网络宽带资源的占用,节省服务器资源
WebSocket事件
事件 | 事件处理程序 | 说明 |
open |
Socket.onopen |
建立soocket连接时触发 |
message |
Socket.onmessage |
客户端从服务器接收数据时触发 |
error |
Socket.onerror |
连接发生错误时触发 |
close |
Socket.onclose |
连接被关闭时触发 |
var socket = new WebSocket("ws://echo.websocket.org");
socket.onopen = function(){
socket.send('hello');
}
socket.onmessage = function(e){//响应回来时触发
console.log(e);
console.log(e.data);
socket.close();
}
socket.onclose = function(){
console.log('close');;
}