express+socket.io实现一个简易聊天窗
首先是node代码:
const express = require('express') const bodyParser = require('body-parser') const app = express() app.use(bodyParser.urlencoded({ extended: false })) const server = require('http').createServer(app); const io = require('socket.io')(server); // 登陆接口 app.post('/login', (req, res) => { console.log(req.body) let { name, password } = req.body if (name === 'admin') { if (password === 'admin') { res.json({ code: 200, msg: '验证通过' }) } else { res.json({ code: 500, msg: '密码错误' }) } } else { res.json({ code: 500, msg: '用户名错误' }) } }) const lsit = ['仁义道德,也是一种奢侈', '时间不在于你拥有多少,而在于你怎样使用', '放马过来吧!你会死的很光荣的', '念当年有爱的我,可惜啊,你们看不到啦', '即使一无所有,也要未雨绸缪', '落叶的一生,只是为了归根么', '千军万马一将在,探囊取物有何难', '顺我者昌,逆我者亡,此乃天意', '我可以想去哪就去哪,但是我只想进入你的心里', '我宁愿犯错误,也不愿什么都不做', '不要测试你的运气,召唤师', '死亡如风,常伴吾身', '我在时光中穿梭,只为找回曾经美好的时光' ] // websocket io.on('connection', (socket) => { // 向客户端发送消息 socket.emit('msg', { name: '服务端', content: '你好,欢迎使用Socket.io' }) // 向所有客户端发送消息 io.emit('broadcast',/* */) socket.on('msg', (msg) => { console.log(lsit[Math.floor(Math.random() * lsit.length)]) setTimeout(() => { socket.emit(msg.type, { name: '服务端', content: lsit[Math.floor(Math.random() * lsit.length)] }) }, 500) }) }); app.use(express.static(`${__dirname}/static`)) app.get('/', function (req, res) { res.sendFile(`${__dirname}/index.html`) }) app.get('*', function (req, res) { res.send('Hello World') }) server.listen(3000)
其次是html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <title>聊天室</title> <!-- Bootstrap --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 --> <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 --> <!--[if lt IE 9]> <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script> <![endif]--> </head> <body> <div class="container"> <h1 style="text-align: center;">express+socket.io聊天室</h1> <style> #showLog { display: block; } </style> <!-- 登陆 --> <div class="row" id="showLog"> <div class="col-md-12"> <div class="form-group"> <label for="userId">账号</label> <!-- admin --> <input type="text" class="form-control" id="userId" value="admin" placeholder="输入账号"> </div> <div class="form-group"> <label for="password">密码</label> <!-- admin --> <input type="password" class="form-control" id="password" value="admin" placeholder="输入密码"> </div> <button id="login" class="btn btn-success">登陆</button> </div> </div> <style> #showCon { display: none; height: 650px; background: url('img/backgroundimg.jpg') center no-repeat; background-size: cover; border: 2px solid #ccc; border-radius: 10px; overflow-y: auto; } .alert { padding: 8px; } .left { text-align: left; } .right { text-align: right; } </style> <!-- 聊天室 --> <div class="row" id="showCon"> <div class="col-md-12"> <!-- 左侧接收别人消息 --> <!-- <div class="left"> <p><span class="label label-warning">张三</span></p> <p><span class="alert alert-warning">hajdhjahdajdhajsdhjahdjadhjadhj</span></p> </div> --> <!-- 右侧自己消息 --> <!-- <div class="right"> <p><span class="label label-success">张三</span></p> <p><span class="alert alert-success">hajdhjahdajdhajsdhjahdjadhjadhj</span></p> </div> --> </div> </div> <div style="display: none;" id="hideTxt"> <div class="form-group row"> <label for="cont">输入想要发送的消息</label> <textarea class="form-control col-md-12" id="cont" onkeydown="if(event.keyCode==13){event.keyCode=0;event.returnValue=false;}"></textarea> </div> <button style="float: right;" class="btn btn-success" onclick="btnSend()">发送</button> </div> </div> <!-- 模态提示框 --> <div class="modal fade" tabindex="-1" role="dialog" id="myModal"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title">提示</h4> </div> <div class="modal-body"> <p id="modal"></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div><!-- /.modal --> <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) --> <script src="js/jquery.min.js"></script> <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 --> <script src="js/bootstrap.min.js"></script> <script src="/socket.io/socket.io.js"></script> <script> var content = $('#showCon .col-md-12'); var socket = null; // 登陆 $('#login').click(() => { var userId = $('#userId').val() var password = $('#password').val() if (userId && password) { $.ajax({ url: 'http://localhost:3000/login', type: 'post', data: { name: userId, password }, success(res) { if (res.code === 200) { $('#showLog').hide() $("#showCon,#hideTxt").show() socket = io('ws://localhost:3000'); socket.on('connect', function () { console.log('建立连接'); }); socket.on('msg', function (data) { console.log(data) content.append(` <div class="left"> <p><span class="label label-warning">${data.name}</span></p> <p><span class="alert alert-warning">${data.content}</span></p> </div> `) scro() }); socket.on('disconnect', function () { console.log('断开连接'); }); } } }) } else { $('#myModal').modal('show') $('#modal').text('请输入正确的账号或密码') } }) // 发送消息到服务端 // socket.emit('msg', '哈哈哈啊哈') function btnSend() { var txt = $('#cont').val() if (!txt) { $('#myModal').modal('show') $('#modal').text('请输入内容') return; } else { socket.emit('msg', { name: 'admin', content: txt, type: 'msg' }) content.append(` <div class="right"> <p><span class="label label-success">admin</span></p> <p><span class="alert alert-success">${txt}</span></p> </div>` ) $('#cont').val('') scro() } } // 滚动条已知在底部 function scro() { var scr = document.querySelector('#showCon') scr.scrollTop = scr.scrollHeight; } window.onkeydown = (e) => { var theCode = e || window.event if (theCode.keyCode === 13) { btnSend() } } </script> </body> </html>
然后有一些npm包,我把package.json里面内容拿过来,方便安装依赖
{ "name": "socketIo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "bootstrap": "^3.4.1", "express": "^4.17.1", "socket.io": "^2.3.0" } }
赞 (0)