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会有一次请求的发送和接收。