IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> socket.io案例 -> 正文阅读

[网络协议]socket.io案例

需求如下

1、在聊天界面中建立websocket连接.

2、一个客户端发消息, 服务端接收消息后把消息分发给所有客户端.

3、客户端接收服务端发回来的消息, 打印.(显示在聊天记录区域)

4、提示当前在线人数.

(1)服务端中一旦接收到客户端连接, 维护一个全局变量count, 记录当前在线人数(count++)
(2)当服务端发现有客户端断开连接就需要让(count–)

5、无论count如何变化, 只要count有变化就需要将count实时发给所有客户端.

6、客户端接收服务端发过来的消息countmsg. 将人数实时显示在页面中.

7、登录, 发消息时携带头像/昵称等参数.

完整demo

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./styles/chart.css">
    <link rel="stylesheet" href="./styles/normalize.css">
    <link rel="stylesheet" href="./styles/reset.css">
</head>
<body>
    <div id="chart-container">
        <div class="chart-user-list" id="chart-user-list">
            <div id="userinfo" class="user-item">
                <img src="images/avatar/15.jpg" alt="">              
                未知名
            </div>
        </div>
        <div class="chart-main-area">
            <div class="chart-main-title">
                <h1>微信聊天室(<span id="userNumber"></span>)-<span id="currentUser"></span></h1>
            </div>
            <div class="chart-list" id="chat-list">
                <!-- 
                <div class="user-logined" id="user-logined"><span id="logined-user"></span>上线了</div>
                <div class="chart-item">
                    <div class="user-face"><img src="images/avatar/11.jpg" alt=""></div>
                    <div class="user-message">111</div>
                </div>
                 -->
            </div>
            <div class="chart-form">
                <div><textarea class="chart-form-message" id="message"></textarea></div>
                <div><input type="button" id="send" class="chart-form-send" value="发表"></div>
            </div>
        </div>
    </div>
</body>
<script src="/socket.io/socket.io.js"></script>
    <script>
        //建立websocket连接
        let socket=io()
        console.log(socket);

        //监听服务端发送给客户端的消息,并且输出打印到聊天记录区
        socket.on('news',(data)=>{
            console.log(data);
            //创建一个div,追加到chat-list子元素的末尾
            let div=document.createElement('div')
            //添加类名
            div.className='chart-item'
            div.innerHTML=`<div class="user-face">
                                <img src="images/avatar/${data.avatar}" alt="">
                            </div>
                            <div class="user-name">${data.name}</div>
                            <div class="user-message">${data.msg}</div>`
            //追加到chart-list子元素的末尾
            let chatlist=document.getElementById('chat-list')
            chatlist.appendChild(div)
            //让滚动条始终保存在底部
            chatlist.scrollTop=chatlist.scrollHeight
        })

        //为发表绑定事件,点击发送消息
        send.addEventListener('click',()=>{
            let msg=message.value.trim()
            console.log(msg);
            if(msg.length<1 || msg.length>25) return
            //向服务端发送消息
            socket.emit('news',{msg,name,avatar})
            //输入完毕就清空
            message.value=''
        })

        //客户端接收服务端发来的count人数变化
        socket.on('countmsg',(data)=>{
            console.log(data);
            userNumber.innerHTML=data
        })


        //看是否点击登录,没有就跳转到登陆页面
        //获取查询字符串
        let search=decodeURI(location.search)
        console.log(search);
        if(!search){
            location.href='login.html'
        }
        
        //截取查询字符串的用户名与头像
        let name=search.split('&')[0].split('=')[1]
        let avatar=search.split('&')[1].split('=')[1]
        console.log(name,avatar);

        //登录成功后,更新界面中的头像和昵称
        userinfo.innerHTML=`<img src="images/avatar/${avatar}" alt="">              
                ${name}`
    </script>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./styles/chart.css">
    <link rel="stylesheet" href="./styles/normalize.css">
    <link rel="stylesheet" href="./styles/reset.css">
</head>
<body>
    <div id="login-container">
        <div class="login-title">微信聊天室</div>
        <div class="login-user-icon">
            <img src="images/login.png" alt="">
        </div>
        <div>
            <input type="text" id="username" class="login-item login-username" placeholder="请输入聊天昵称">
        </div>
        <div>
            <input type="button" id="login" class="login-item login-button" value="登录">
        </div>
    </div>
</body>
<script>
    login.addEventListener('click',()=>{
        //获取昵称
        let name=username.value
        console.log(name);
        //获取头像
        let avatar=Math.floor(Math.random()*100)+'.jpg'
        //点击登录跳转到index页面
        location.href=`index.html?name=${name}&avatar=${avatar}`
    })
</script>
</html>

app.js

const { Socket } = require('socket.io');

//引入express模块
const express=require('express')
const app=express()
//引入http模块
const server=require('http').Server(app)
//引入socket.io模块
const io=require('socket.io')(server)

//创建端口
server.listen(3000,()=>{
    console.log('server is Running');
})

//将静态资源托管到public目前下
app.use(express.static('./public'))

//声明一个变量。保存在线人数
let count=0
//建立连接
io.on('connection',(socket)=>{
    console.log('有人进来了',socket.id);
    //有人进来了,让count++
    count++
    //服务端将count实时发送给所有的客户端
    io.emit('countmsg',count)

    //当服务端发现有人离开就断开连接,count--
    socket.on('disconnect',()=>{
        count--
        io.emit('countmsg',count)
        console.log('有人离开了');
    })

    //通过socket监听获取文本
    socket.on('news',(data)=>{
        console.log(`${socket.id} 说:${data}`);
        console.log(data);
        //服务端接收消息把消息分发给客户端:广播
        io.emit('news',data)
    })
})
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:40:09  更:2021-12-15 18:41:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:41:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码