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"
  }
}
   

相关