JavaScript 引入websocket模块——编写简单聊天室

先上演示过程,支持多用户同时使用(一激动 老是打错hhhh...)

这里我是同时打开了两个网页。

代码如下:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天室</title>
</head>
<body>
<div id="main">
    <p>
        <input type="text" id="username" placeholder="请输入用户名"/>
        <button type="button" id="addBtn">加入</button>
    </p>
    <p>
        <input type="text" id="message" placeholder="请输入聊天信息"/>
        <button type="button" id="sendBtn" disabled>发送</button>
    </p>
    <ul id="msg"></ul>
</div>

</body>
<script>
    window.onload = function () {
        //获取button对象
        let addBtn = document.getElementById("addBtn")
        let sendBtn = document.getElementById("sendBtn")
        let username = document.getElementById("username")
        var message = document.getElementById("message")
        //定义全局
        let ws = null;
        addBtn.onclick = function () {
            join()

        }

        //给文本框添加键盘点击事件
        username.onkeyup = function (e) {
            //如果输入的是回车,进聊天室
            if (e.keyCode === 13) {
                join()
                username.disabled = true
            }
        }


        sendBtn.onclick = function () {
            sendMessage()
        }
        message.onkeyup = function(e){
            if(e.keyCode === 13) sendMessage()
        }

        function join() {
            addBtn.disabled = true
            sendBtn.disabled = false
            // 创建WebSocket对象,WebSocket使用的是ws协议
            ws = new WebSocket('ws://localhost:2555')
            ws.onopen = function () {
                let username = document.getElementById("username").value
                // 项服务器端发送消息
                ws.send(
                        // 往后台发送json字符串
                        JSON.stringify({
                            username: username,
                            type: 'login'  //添加的对象
                        })
                )
            }
            // onmessage与ws已经绑定,接受消息回来的时候还是会回到这里来
            // 服务器发送消息后会触发
            ws.onmessage = function (e) {
                console.log(e.data)
                //字符串对象转json对象
                let data = JSON.parse(e.data)
                let show
                switch (data.type) {
                    case 'login': //新用户
                        show = `${data.username}加入了房间`
                        break;
                    case 'msg': // 有新的聊天信息
                        show = `${data.username} ${data.time} <br> ${data.message}`
                        break
                    case 'leave': //有人离开聊天室
                        show = `${data.username}离开了房间 ${data.time}`
                        break;
                }
                let li = document.createElement("li")
                li.innerHTML = show
                document.getElementById("msg").append(li)
            }
        }

        function sendMessage() {
            let username = document.getElementById("username").value
            let msg = document.getElementById("message").value
            //发送聊天消息给服务器
            ws.send(JSON.stringify({
                username: username,
                message: msg,
                type: 'msg'
            }))
            document.getElementById("message").value = ''
        }
    }
</script>
</html>

2、app.js

//后台服务器代码
//引入websocket模块
let ws = require('nodejs-websocket')

//创建服务对象启动,监听端口号是2555
let server = ws.createServer((conn)=>{
    console.log('有人连接...')
    //当客户端发消息时会触发text事件
    conn.on('text',(str)=>{
        let data = JSON.parse(str)
        console.log(data)
        //判断接受消息的类型
        switch(data.type){
            case 'login': //新用户加入
                conn.nickname = data.username //保存用户名属性
                broadcast(
                    //发送json字符串告诉客户端有新用户加入
                    JSON.stringify({
                        username:data.username,
                        time:getTime(),
                        type:data.type
                    })
                )
                break
            case 'msg':
                broadcast(
                    JSON.stringify({
                        username:data.username,
                        time:getTime(),
                        message:data.message,
                        type:data.type
                    })
                )
                break
        }
    })

    //监听错误信息
    conn.on('error',(err)=>{
        console.log(err)
    })

    //监听断开连接
    conn.on('close',()=>{
        broadcast(
            JSON.stringify({
                username:conn.nickname,
                time:getTime(),
                type:'leave'
            })
        )
    })

}).listen(2555)

//给所有客户端连接发送消息
function broadcast(str){
    //遍历所有的客户端连接
    server.connections.forEach((conn)=>{
        //发送消息
        conn.send(str)
    })
}

function getTime(){
    var date = new Date();
    var hour = date.getHours();
    var min = date.getMinutes()
    var sec = date.getSeconds()
    return hour + ":" + min + ":" + sec
}

不要忘记实现导入websocket框架;

安装包 nodejs-websocket
npm install nodejs-websocket

猜你喜欢

转载自blog.csdn.net/LiLi_code/article/details/86583347
今日推荐