webSocket使用-socket.io包使用

目标

  • 自己用原生JS实现一次WebSocket使用
  • 前提: 一定需要一个后端服务器(支持socket的)

概念

它是一种新的技术, 前后端只要支持这种协议, ==后端可以主动向前端推送内容==

项目中使用: 做一个智能客服

Websocket 通过HTTP/1.1 协议的101状态码进行握手

其实VueCli脚手架服务器 和 浏览器之间就建立了一个WebSocket通道

才实现的代码一改, 服务器向浏览器主动推送更新的js文件, 页面就自动更新了

协议对比

小结

  1. vuecli脚手架启动的webpack开发服务器, 和浏览器之间也建立着一条socket通道
  2. WebSocket还是基于TCP, 但是会隔几秒发一个很小的包给后台(心跳包) 维持这段连接

 socket.io包使用:

前端对WebSocket封装很好

后端对socket代码也封装好了

目标

后端代码

在server的使用文件下安装相关包配置:

npm i socket.io
npm i express

 在根目录下创建server.js文件:

const express = require('express')
const app = express()
// const cors = require('cors')
// app.use(cors())
// eslint-disable-next-line node/no-path-concat
app.use(express.static(`${__dirname}/public`))// 设置服务器静态资源目录(目录下的资源可以让服务器直接访问)

const http = require('http').Server(app)// 使用http模块,实例化为http对象
http.listen(4005)// 设置服务器端口
const io = require('socket.io')(http)// socket.io要的http对象不是express对象,而是服务器上socket服务对象

// io.on('connection') -- 固定的, 用于 监测有没有人用socket服务链接我, 触发后面的函数
io.on('connection', function (socket) { // socket连接者对象
  // console.log('a user connected');
  socket.on('cTos', data => { // 谁来链接我, 我就给谁绑定一个事件叫cTos(随便), data接收的就是前端触发这个事件传递过来的聊天消息
    // io.sockets(拿到当前连接池里所有的socket对象-链接到我的所有人), emit()触发事件(前端事件叫sToC) ---- 广播
    io.sockets.emit('sToC', data) // 把当前收到的聊天消息, 发送给所有连接着(前端)
  })
})

前端代码:

在public文件夹下创建index.js文件

<!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>首页</title>
</head>

<body>
    <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
    <!-- 1. 引入前端的socket.io注意版本 一定要跟后台对上 -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/client-dist/socket.io.min.js"></script>
    <div>
        <p>聊天窗口:</p>
        <hr>
        <div id="result"></div>
    </div>
    <div>
        <input type="text" placeholder="用户名" id="user">
        <input type="text" placeholder="消息" id="msg">
        <button id="btn">发送</button>
    </div>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        // 2. 用io()函数链接socket服务器
        // 如果代码部署到了线上服务器, 这个localhost要换成线上的ip地址
        // 因为这个网页请求到本地浏览器上查看, 你要还是localhost那不是请求本地呢吗?
        const socket = io("ws://localhost:4005")
        $("#btn").on("click", function () {
            let user = $("#user").val()
            let msg = $("#msg").val()
            console.log(user, msg);

            // 3. socket触发后端的事件
            socket.emit('cTos', { user, msg })
        })

        socket.on('sToC', obj => {
            $("#result").append($(`<p>${obj.user} 说: ${obj.msg}</p>`))
        })

        axios({
        // url: '/api/nc/article/headline/T1348647853363/0-40.html'// 开发环境用
       url: 'http://c.m.163.com/nc/article/headline/T1348647853363/0-40.html'// 上线环境
        }).then(res => {
        console.log(res)
       })
    </script>
</body>

</html>

第三方使用

使用第三方公司封装的插件(SDK)

推荐2个比较常用的即时通信服务平台

  • 环信
  • 容联云

具体使用过程, 根据文档, 集成到自己项目中

小结

  1. 可以不用原生WebSocket干, 使用一些包例如, socket.io包
  2. 前端要注意使用client名字的js文件
  3. 也可以使用第三方服务, 快速集成功能

猜你喜欢

转载自blog.csdn.net/m0_65812066/article/details/128642428