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">
<title>聊天室title>
<link href="css/bootstrap.min.css" rel="stylesheet">
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>
<input type="text" class="form-control" id="userId" value="admin" placeholder="输入账号">
div>
<div class="form-group">
<label for="password">密码label>
<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>
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>
div>
div>
<script src="js/jquery.min.js">script>
<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" } }