Node.js学习日记(九):websocket

328 阅读1分钟

express的学习先略过,书上的例子不太好写,之后做自己的项目的时候再仔细写。

一、ajax

ajax:web2.0时代,我们可以不用每次都通过交互操作才能从服务端获取新的HTML文档,无需重新渲染整个页面,获取不必要的数据、图片和脚本、样式文件。

但是还是存在着一个问题,当发送像鼠标位置这样的信息时,依然存在着很多冗余的信息(头信息),并且我们不能确定消息到达的先后顺序。

H5提供了解决方案,也就是websocket,websocket是web下的TCP,一个底层双向的socket,允许用户对消息传递进行控制,websocket在浏览器下有api定义,且在服务端可以使用websocket协议。

webSocket服务端

var express=require('express')
var expressWs = require("express-ws");
var app=express()
expressWs(app)
app.use(express.static('public'))
// app.get('/',function(req,res){
//     res.render('index')
// })
app.ws('/',function(ws,req){
    ws.send("你连接成功了");
    ws.on("message", function (msg) {
        console.log('got',msg)
        ws.send('pong');
    });
})
app.listen(3000)

书上用的websocket.io不是很能用了,所以换了一个。用法大致相同,将app传入容器,监听'/'地址,返回请求和ws实例,ws实例提供了send方法,用于向浏览器socket发送数据。通过监听message事件,我们可以拿到浏览器通过websocket为我们发送的数据。

浏览器客户端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>websocket echo</title>
    <script>
        var lastMessage
        window.onload=function(){
            var ws=new WebSocket('ws://localhost:3000')
            ws.onopen=function(){
                //send first ping
                ping()
            }
            ws.onmessage=function(ev){
            console.log('got',ev.data)
            document.getElementById('latency').innerHTML=new Date -lastMessage
            ping()
        }
            function ping(){
                lastMessage= +new Date
                ws.send('ping')
            }
        }
    </script>
</head>
<body>
    <h1>WebSocket echo</h1>
    <h2>Latency:<span id="latency"></span>ms</h2>
</body>
</html>

在客户端创建一个websocket对象,监听在localhost:3000上,启动连接时,向服务端发送一个ping,并接受从服务端发送过来的数据,同时,记录现在的时间和上一次ping的时间,相间可以得到服务器处理的事件。结果显示,每1ms会有一次请求的发送和接收。