express+websocket实现简单的聊天室

编写后台接口

1.引入express 以及 express-ws
```
npm install express express-ws
```
2.编写聊天室接口

简单描述:
1.首先引入ws
2.创建连接
3.每个用户都有一个conn 那把conn存入到数组里方便以后广播所接受到的消息,去传达到其他用户。
4.对用户数量做一个统计
5.接收到前端传来设置的用户名
6.数据格式统一

obj={
	type:'name'|'count'|'message';
	data:''
}

代码如下:

const express = require("express");
const expressWs = require("express-ws");
const router = express.Router();
expressWs(router);

let count = 0;
//存放所有连接的用户
let connections = [];
router.ws('', conn => {
    //每个用户都有一个conn
    count++;
    console.log(`游客进入聊天室,当前在线人数${count}`);
    sendMsg(conn, 'count', count);
    broadcast(JSON.stringify({ type: 'count', data: count }));
    //接收用户发来的数据
    conn.on('message', function(msg) {
            let obj = JSON.parse(msg);
            if (obj.type === 'name') {
                conn.userName = obj.data;
                connections.push(conn);
                console.log(`用户的名字为${conn.userName},当前在线人数${count}`);
                sendMsg(conn, 'name', conn.userName);
                broadcast(JSON.stringify({ type: 'toast', data: `${conn.userName}进入了聊天室` }));
            } else if (obj.type === 'message') {
                broadcast(JSON.stringify({ type: 'message', data: obj.data, userName: conn.userName }))
            }
        })
        //监听关闭状态
    conn.on('close', function() {
        count--;
        broadcast(JSON.stringify({ type: 'count', data: count }));
        broadcast(JSON.stringify({ type: 'toast', data: `${conn.userName}离开了聊天室,当前在线人数${count}` }));
        console.log(`用户:${conn.userName ? conn.userName :'游客'}离开了聊天室,当前在线人数${count}`);
    })
})


function broadcast(msg) {
    // 群发消息给所有用户
    connections.forEach(item => {
        item.send(msg)
    })
}
//单独发送给一个用户
function sendMsg(conn, type, data) {
    conn.send(JSON.stringify({ type: type, data: data }));
}

module.exports = router;
3.设置路由为 /ws/many
const manyWs = require('./many-ws');
app.use('/ws/many', manyWs);

前端逻辑

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下:
    btn.onclick = function() {
        userName = userName.value;
        let obj = {
            type: 'name',
            data: userName
        }
        obj = JSON.stringify(obj);
        ws.send(obj);
        namePanel.style.display = 'none';
    }
	//传后台
    ws.onmessage = function(res) {
        let obj = JSON.parse(res.data);
        if (obj.type === 'name') {
            userNameSpan.innerHTML = obj.data;
        } else if (obj.type === 'count') {
            peopleNum.innerHTML = obj.data;
            console.log(obj)
        } else if (obj.type === 'toast') {
            msgCon.innerHTML += addToast(obj.data);
            msgCon.scrollTo({
                top: msgCon.scrollHeight,
                behavior: "smooth",
            });
        } else if (obj.type === 'message') {
            obj.userName === userName ? textHtml('right', obj.data) : textHtml('left', obj.data);
        }

    }

    textarea.onkeyup = function(e) {
        let val = textarea.value;
        if (e.keyCode === 13) {
            if (val.trim() !== "") {
                ws.send(JSON.stringify({
                    type: 'message',
                    data: val
                }));
                textarea.value = '';
            } else {
                tips.style.display = "block";
                setTimeout(() => {
                    tips.style.display = "none";
                }, 1000);
            }
        }
    };

    backBtn.onclick = function() {
        location.href = "http://localhost:3001"
    }

    function addToast(data) {
        return `<div class="panel-toast">${data}</div>`
    }

    function textHtml(position, text) {
        let str = '';
        if (position === "left") {
            str = `<div class="msg msg-${position}">
        <img src="./img/${position==='left'?'dufu':'libai'}.png" alt="">
        <section>
            <span>${text}</span>
            </section>
        </div>;`;
        } else if (position === "right") {
            str = `
        <div class="msg msg-right">
            <section>
                <span>${text}</span>
            </section>
            <img src="./img/libai.png" alt="">
        </div>`;
        }
        msgCon.innerHTML += str;
        msgCon.scrollTo({
            top: msgCon.scrollHeight,
            behavior: "smooth",
        });
    }

小白一个不喜勿喷,样式代码我就不放了,自行设计=-=

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 ExpressWebSocket,需要先安装 `express` 和 `ws` 包: ``` npm install express ws ``` 接着,在 Express 应用中启用 WebSocket,可以使用以下代码: ```javascript const express = require('express'); const app = express(); const WebSocket = require('ws'); const server = app.listen(3000, () => { console.log('Server started on port 3000'); }); const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { console.log('Client connected'); ws.on('message', (message) => { console.log(`Received message => ${message}`); }); ws.send('Hello! Message From Server!!'); }); ``` 在上述代码中,我们创建了一个 Express 应用,并将其绑定到端口 3000。然后,我们通过创建一个 WebSocket 服务器实例,并将其连接到 Express 应用的服务器。最后,我们监听 `connection` 事件,当有新的 WebSocket 连接时,我们会向客户端发送一条欢迎消息,并在控制台打印出客户端发送的任何消息。 在客户端,我们可以使用 JavaScript 的 `WebSocket` 对象来与服务器建立连接,如下所示: ```javascript const ws = new WebSocket('ws://localhost:3000'); ws.onopen = () => { console.log('Connected to server'); ws.send('Hello! Message From Client!!'); }; ws.onmessage = (message) => { console.log(`Received message => ${message.data}`); }; ``` 在上面的代码中,我们首先创建了一个 WebSocket 对象,并将其连接到服务器。当连接建立后,我们会收到一个 `onopen` 事件,我们可以在该事件中向服务器发送一条消息。当我们收到来自服务器的消息时,我们会收到一个 `onmessage` 事件,并在控制台打印出消息。 这就是使用 ExpressWebSocket 的基本流程。你可以根据自己的需要,进一步定制这些代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值