当前位置: 首页 > Web前端 > HTML5

websocket_0

时间:2023-04-05 21:26:00 HTML5

什么是websocket?Websocket是一种网络协议,是一种基于HTTP优化的协议,与HTTP没有直接关系。HTTP协议HTTP(HypertextTransferProtocol):规定了网络浏览器如何从网络服务器获取文档并将表单内容提交给网络服务器,以及网络服务器如何响应这些请求并将它们提交回浏览器。HTTP的第一个版本称为HTTP/0.9,是一种用于在Internet上传输原始数据的简单协议。RFC1945[6]定义的HTTP/1.0进一步改进了该协议。它允许以类似MIME的消息格式发送消息,其中包括有关传输数据的元数据和请求/响应语义的装饰。HTTP/1.0没有充分考虑分层代理、缓存的含义以及对持久连接和虚拟主机的需求。HTTP/1.1,1.0版本已经优化,开始支持长连接和缓存。为什么需要webSockets?因为HTTP协议有一个缺陷:通信只能由客户端发起,服务端不能实时将最新的数据发送给客户端。如果我想要最新的数据怎么办?可以使用Ajax轮训,Ajax轮训是一个定时器,让它每次请求服务器。这个webSocket可以让服务端主动实时更新数据给客户端。例如;查询天气,现在天气怎么样?客户端请求服务器,服务器反馈:现在天气晴朗,过一段时间天气会变,用户要再请求一次才能看到天气变化,而不是实时更新反馈数据从服务器时间,体验可以更好。HTTP和WebSocket连接方式比较(最大区别)HTTP:客户端请求一次,服务端反馈一次webSocket:一个客户端请求可以有多个响应设置为Upgrade,表示客户端希望升级连接。Upgrade字段必须设置为Websocket,表示要升级到Websocket协议。Sec-WebSocket-Key是一个随机字符串,服务器将使用这些数据构造SHA-1消息摘要。在“Sec-WebSocket-Key”中添加特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,再进行BASE-64编码,将结果作为“Sec-WebSocket-Accept”"标头值,返回给客户端。这样做可以尽量避免将普通的HTTP请求误认为是Websocket协议。Sec-WebSocket-Version表示支持的Websocket版本。RFC6455要求的版本是13,之前的草案版本应该被弃用。Sec-WebSocket-Protocal是用户自定义的字符串,用于区分同一URL下不同服务所需要的协议。Origin字段是可选的,通常用于表示在浏览器中发起Websocket连接的页面,类似于Referer。但是,与Referer不同,Origin仅包含协议和主机名。Websocket中也可以使用HTTP协议中定义的其他一些字段,例如Cookie。webSocket的特点(1)基于TCP协议,服务器端实现相对容易。(2)与HTTP协议有很好的兼容性。默认的端口也是80和443,而且握手阶段使用的是HTTP协议,所以在握手的时候不容易屏蔽,可以通过各种HTTP代理服务器。(3)数据格式比较轻,性能开销小,通信效率高。(4)可以发送文本或二进制数据。(5)没有同源限制,客户端可以和任何服务器通信。(6)协议标识为ws(如果加密为wss),服务器URL为url(7)webSocket的使用不受同源策略限制CreatewebSocketvarSocket=newWebSocket(url);Websocket方法:1、Socket.send()send(data)方法使用连接传输数据。2.Socket.close()close()方法用于终止任何现有的连接执行结果如下:websocket事件onopenonopen属性用于指定连接后的回调函数成功,看上面的代码,我们在连接成功后,打印连接成功,并调用send方法。如果要指定多个回调函数,则需要使用addEventListener方法。onclose与onopen的用法相同,指定关闭连接的回调。onmessage指定接收到服务器数据后的回调,返回的数据可以通过回调中的参数.data获取。onerror指定发生错误时的回调send用于发送数据,不仅仅是普通的字符串文本,还包括其他类型的数据(例如ArrayBuffer)。bufferedAmount可以得到当前有多少数据未发送,用于判断发送是否结束。if(socket.bufferedAmount===0){console.log("sendcompleted");}else{console.log("still",socket.bufferedAmount,"datanotsent");}注:WebSocket.orgA提供专门用于测试WebSocket的服务器“ws://echo.websocket.org”。Websocket的优点是客户端和服务端都可以主动向对方传输数据;不需要频繁的创建和销毁TCP请求,减少了网络带宽资源的占用,也节省了服务器资源;官网http://websocketd.com/