iframe流方法是在页面中插入一个潜匿的iframe,操作其src属性在处事器和客户端之间建设一条长毗连,处事器向iframe传输数据(凡是是HTML,内有认真插入信息的javascript),来及时更新页面。
- 利益:动静可以或许及时达到;赏识器兼容好
- 弱点:处事器维护一个长毗连会增进开销;IE、chrome、Firefox会表现加载没有完成,图标会不断旋转。
- // 3.html
-
- <body>
-
- <div id="clock"></div>
-
- <iframe src="/clock" style="display:none"></iframe>
-
- </body>
-
- //iframe流
-
- let express = require('express')
-
- let app = express()
-
- app.use(express.static(__dirname))
-
- app.get('/clock', function(req, res) {
-
- setInterval(function() {
-
- let date = new Date().toLocaleString()
-
- res.write(`
-
- <script type="text/javascript">
-
- parent.document.getElementById('clock').innerHTML = "${date}";//改变父窗口dom元素
-
- </script>
-
- `)
-
- }, 1000)
-
- })
-
- app.listen(8080)
启动当地处事,打开http://localhost:8080/3.html,获得如下功效:
上述代码中,客户端只哀求一次,然而处事端却是绵绵不断向客户端发送数据,这样处事器维护一个长毗连会增进开销。
以上我们先容了三种及时推送技能,然而各自的弱点很明明,行使起来并不抱负,接下来我们着重先容另一种技能--websocket,它是较量抱负的双向通讯技能。
二、WebSocket
1.什么是websocket
WebSocket是一种全新的协议,跟着HTML5草案的不绝完美,越来越多的当代赏识器开始全面支持WebSocket技能了,它将TCP的Socket(套接字)应用在了webpage上,从而使通讯两边成立起一个保持在勾当状态毗连通道。
一旦Web处事器与客户端之间成立起WebSocket协议的通讯毗连,之后全部的通讯都依赖这个专用协议举办。通讯进程中可相互发送JSON、XML、HTML或图片等恣意名目标数据。因为是成立在HTTP基本上的协议,因此毗连的提倡方还是客户端,而一旦建立WebSocket通讯毗连,岂论处事器照旧客户端,恣意一方都可直接向对方发送报文。
首次打仗 WebSocket 的人,城市问同样的题目:我们已经有了 HTTP 协议,为什么还必要另一个协议?
2.HTTP的范围性
- HTTP是半双工协议,也就是说,在统一时候数据只能单向活动,,客户端向处事器发送哀求(单向的),然后处事器相应哀求(单向的)。
- 处事器不能主动推送数据给赏识器。这就会导致一些高级成果难以实现,诸如谈天室场景就没法实现。
3.WebSocket的特点
- 支持双向通讯,及时性更强
- 可以发送文本,也可以发送二进制数据
- 镌汰通讯量:只要成立起WebSocket毗连,就但愿一向保持毗连状态。和HTTP对比,不单每次毗连时的总开销镌汰,并且因为WebSocket的首部信息很小,通讯量也响应镌汰了
相对付传统的HTTP每次哀求-应答都必要客户端与处事端成立毗连的模式,WebSocket是相同Socket的TCP长毗连的通信模式,一旦WebSocket毗连成立后,后续数据都以帧序列的情势传输。在客户端断开WebSocket毗连或Server端断掉毗连前,不必要客户端和处事端从头提倡毗连哀求。在海量并发和客户端与处事器交互负载流量大的环境下,极大的节减了收集带宽资源的耗损,有明明的机能上风,且客户端发送和接管动静是在统一个耐久毗连上提倡,及时性上风明明。
接下来我看下websocket怎样实现客户端与处事端双向通讯:
- // websocket.html
-
- <div id="clock"></div>
-
- <script>
-
- let clockDiv = document.getElementById('clock')
-
- let socket = new WebSocket('ws://localhost:9999')
-
- //当毗连乐成之后就会执行回调函数
-
- socket.onopen = function() {
-
- console.log('客户端毗连乐成')
-
- //再向处事 器发送一个动静
-
- socket.send('hello') //客户端发的动静内容 为hello
-
- }
-
- //绑定变乱是用加属性的方法
-
- socket.onmessage = function(event) {
-
- clockDiv.innerHTML = event.data
-
- console.log('收随处事器端的相应', event.data)
-
- }
-
- </script>
-
- // websocket.js
-
- let express = require('express')
-
- let app = express()
-
- app.use(express.static(__dirname))
-
- //http处事器
-
- app.listen(3000)
-
- let WebSocketServer = require('ws').Server
-
- //用ws模块启动一个websocket处事器,监听了9999端口
-
- let wsServer = new WebSocketServer({ port: 9999 })
-
- //监听客户端的毗连哀求 当客户端毗连处事器的时辰,就会触发connection变乱
-
- //socket代表一个客户端,不是全部客户端共享的,而是每个客户端都有一个socket
-
- wsServer.on('connection', function(socket) {
-
- //每一个socket都有一个独一的ID属性
-
- console.log(socket)
-
- console.log('客户端毗连乐成')
-
- //监听对方发过来的动静
-
- socket.on('message', function(message) {
-
- console.log('吸取到客户端的动静', message)
-
- socket.send('处事器回应:' + message)
-
- })
-
- })
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|