简易聊天室的实现

27 篇文章 0 订阅
13 篇文章 0 订阅

熟练应用socket.io 与fs模块

html 文件

<body>
    <div class="login">
        <input type="text"><button>登录</button>
    </div>
    <div class="box" style="display: none;">
       
        <div class="title">
            <h1>欢迎<span></span></h1>
        </div>
        <div>
            <input type="text"><button>发送</button>私聊的人名:<input type="text">
        </div>
       
        <div class="content">

        </div>
        <div class="users">
            <ul>

            </ul>
        </div>
    </div>
    <script>
        //前端连接到websocket
        const  socket=io("ws://localhost:8088")
        //事件监听 监听后端的事件响应
        socket.on("success",data=>{
            console.log(data)
        })
        socket.on("loginerror",data=>{
            alert(data)
        })
        socket.on("loginsuccess",data=>{
            $(".login").hide()
            $(".box").show()
            $(".box h1 span").html(data)
            socket.on(`to${data}`,chat=>{
                console.log(chat)
            })
        })
        socket.on("adduser",data=>{
            console.log(data+"加入了聊天室")
        })
        socket.on("showuser",data=>{
            let str=""
            data.forEach(item=>{
                str+=`<li>${item}</li>`
            })
            $(".users ul").html(str)
        })
        socket.on("disuser",data=>{
            console.log(data+"退出了聊天室")
        })
        socket.on("showchat",data=>{
            $("<p />").html(`${data.username}说了:${data.message}`).appendTo($(".content"))
        })
        //点击登录
        $("button").eq(0).click(function(){
            let username=$(this).prev().val()
            //将username返回给 websocket服务
            socket.emit('login',username)
        })
        $("button").eq(1).click(function(){
            let message=$(this).prev().val()
            let username=$(this).next().val()
            if(username==""){
                socket.emit("addchat",message)
            }else{
                socket.emit("prichat",{username:username,message:message})
            }
           
        })
    </script>
</body>

app文件

const http = require("http")
const io = require("socket.io")
const fs = require("fs")
const url = require("url")
let users=[]
let server = http.createServer((req, res) => {
    if (req.method == "GET") {
        //谷歌浏览器 默认请求图标地址
        let { pathname, query } = url.parse(req.url, true)
        ///favicon.ico
        if(pathname=="/favicon.ico") return
        if (pathname.endsWith(".html")) {
            fs.readFile(`./www${pathname}`, (err, data) => {
                res.write(data)
                res.end()
            })
        }
    }
})
server.listen(8088)

let ws = io(server) //启动一个websocket服务  8088
//http://
//ws://

ws.on("connect", sock => {
    console.log("有人来了")
    //响应一个事件,欢迎来到聊天室
    //第二参数 返回值 可以是任意类型
    sock.emit("success", "欢迎来到聊天室")
    //监听是否有登录事件 
    sock.on("login", data => {
        let result = users.some(item => item == data)
        if (result) {
            //登录失败
            sock.emit("loginerror","登录失败")
        } else {
            //登录成功
            sock.username=data
            users.push(data)
            sock.emit("loginsuccess", data)
            //给其他人发送一个响应,告诉其他有用户增加 并且弹出谁进入了聊天室
            sock.broadcast.emit("adduser", data)
            //给所有人去更新对应的用户列表
            ws.sockets.emit("showuser",users)
        }
    })
    sock.on("addchat", data => {
         //给所有人去更新对应的用户列表
         ws.sockets.emit("showchat",{username:sock.username,message:data})
    })
    //断开事件监听
    sock.on("disconnect", () => {
        //拿到当前所断开这个人名字
        if (sock.username) {
            let index = users.indexOf(sock.username)
            users.splice(index, 1)
            ws.sockets.emit("disuser", sock.username)
            ws.sockets.emit("showuser",users)
        }
    })
    //前端和后端 1对1 谁发的给谁响应  王一发的 给王二响应
    //1-对所有人!!! 群聊 给所有人  
    //发送一个指定响应给所有人,然后指定前端 去响应对应的指定 
    sock.on("prichat", data => {
        console.log(data)
        //想要私聊的人名 以及私聊内容
        ws.sockets.emit(`to${data.username}`,{username:sock.username,message:data.message})
    })
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值