node 的 socket.io模块能帮助我们快速的实现websocket通信。
1. app.js 使用的是express配合socket.io,所以下载好相对应的包
let express = require('express')let app = express()let http = require('http').Server(app)// 创建io对象,就能访问socket.io.js文件let io = require('socket.io')(http)let session = require('express-session')app.use(session({ // 使用session是为了后面页面显示权限 secret: 'keyboard cat', resave: false, saveUninitialized: true}))let allUser = []app.set('view engine', 'ejs')app.use(express.static('./public')) // public放置了JQ文件app.get('/', (req,res,next) => { res.render('index')})http.listen(3000)复制代码
2. views/index.ejs 首页,输入姓名才可进入发言
复制代码
3. app.js 首页登录逻辑
app.get("check", (req,res,next) => { let username = req.query.username if(!req.query.username) { res.send('必须输入用户名') // 没有输入就不给跳转页面 return; } // 使用一个数组存入每次登录进去的用户 如果重名就报错 简单模仿用户重名 不需要的可以去掉 if(allUser.indexOf(username) != -1) { res.send('用户名被占用') return; } allUser.push(username) req.session.username = username res.redirect('/chat') // 输入用户名后就可以进入发言室发言})复制代码
4. views/chat.ejs 发言室
小小发言室 欢迎:<%= username %>
// 引入需要的js文件 相对的地址是 http://127.0.0.1:3000 复制代码
5. app.js 完善好socket事件以及chat路由
app.get('/chat', (req,res,next) => { // 登录了就把username保存在session 如果未登录就不给进入发言 if(!req.session.username) { res.redirect('/') return; } res.render('chat', { 'username': req.session.username })})io.on('connection', (socket) => { socket.on('chat', (msg) => { // 把接收到的 msg 原样的广播回去 io.emit('chat', msg) })})复制代码
这样就大功告成了,实现一个简单的websocket通讯。过程就是需要用到socket.io模块,引入后监听事件,然后作出响应,就实现了通讯。