当前位置:   article > 正文

使用 vue-3-socket.io 插件以及node.js实现实时聊天(1)_vue3 socket.io

vue3 socket.io

 这篇文章使用选项式API的写法,以实现群聊和私聊为主

客户端自然是对应使用vue3框架,服务端使用node.js配合express、http、socket.io、file等库来实现,具体如下:

一、完成客户端部分的配置代码

1、下载所需的依赖

npm install vue-3-socket.io socket.io-client

2、做socket客户端配置

  1. // 引入相关依赖
  2. import VueSocketIO from "vue-3-socket.io";
  3. import SocketIO from "socket.io-client";
  4. // 创建一个 Socket 连接
  5. const socketio = new VueSocketIO({
  6. debug: false, // 布尔值,控制是否打印调试信息
  7. // SocketIO库的客户端连接对象,指定连接服务端的地址和传输方式
  8. connection: SocketIO("http://localhost:3000", {
  9. transports: ["websocket"],
  10. }),
  11. // 额外添加的请求头信息
  12. extraHeaders: { "Access-Control-Allow-Origin": "*" },
  13. // SocketIO库的配置项对象,用于控制自动连接
  14. options: {
  15. autoConnect: false,
  16. },
  17. });

注:"http://localhost:3000",该地址端口是对应后面配置服务端时所开放的端口。

将 socketio 引入app

  1. const app = createApp(App);
  2. app.use(socketio)

二、完成服务端的配置代码

1、创建一个 node.js 项目

会的直接跳过到下一步

具体如下:

① 先新建一个项目文件夹

注:尽量不要放在前端的项目文件夹中

② 使用命令行创建项目
npm init -y

此时生成一个json文件,如下

  1. {
  2. "name": "chat",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "index.js",
  6. "scripts": {
  7. "test": "echo \"Error: no test specified\" && exit 1"
  8. },
  9. "keywords": [],
  10. "author": "",
  11. "license": "ISC"
  12. }
③ 在同级下建立一个index.js文件

注:这是对应上述代码中"main"字段的值

操作如下:

至此创建完毕,后面开始配置服务端socket

2、开始配置服务端socket

注:配置代码写在 index.js 文件

① 下载所需的依赖
npm install express file http socket.io
② 做socket服务端配置
  1. // 引入express库
  2. var app = require("express")();
  3. // 创建http服务器并将express应用程序作为参数传入
  4. var http = require("http").Server(app);
  5. // 引入Socket.IO库,并将http服务器和配置选项作为参数传入来创建Socket.IO实例
  6. var io = require("socket.io")(http, {
  7. // 允许使用EIO3协议
  8. allowEIO3: true,
  9. // 跨域配置,指定允许跨域的源地址、请求方法和凭据(credentials)设置
  10. cors: {
  11. origin: "http://localhost:3000",
  12. methods: ["GET", "POST"],
  13. credentials: true,
  14. },
  15. });
  16. // 定义根路由"/"的GET请求处理函数
  17. app.get("/", (req, res) => {
  18. // 发送index.html文件作为响应
  19. res.sendFile(__dirname + "/index.html");
  20. });
  21. // 监听客户端发送的连接,端口一定要和客户端的匹配上
  22. http.listen(3000, () => {
  23. console.log("listening on *:3000");
  24. });
③ 启动 node 服务端

 如果没有启动服务端。客户端会一直报websocket的错,属于正常现象,启动node项目就行了

打开chat下的终端,输入 node index.js 启动项目,建立网络连接,客户端就不会再报错了

注:每次修改服务端代码都要重新启动一次

④ connection 钩子的使用
  1. // 定义根路由"/"的GET请求处理函数
  2. app.get("/", (req, res) => {
  3. // 发送index.html文件作为响应
  4. res.sendFile(__dirname + "/index.html");
  5. });
  6. // 新增的代码
  7. // 监听客户端连接
  8. io.on("connection", (socket) => {
  9. console.log("有用户连接");
  10. })
  11. // 监听客户端发送的连接,端口一定要和客户端的匹配上
  12. http.listen(3000, () => {
  13. console.log("listening on *:3000");
  14. });

connection钩子是on方法内置的, 当有客户端发起连接并成功时会触发该钩子,效果如下

至此已经完成所有配置,下面分别介绍怎么通过socket实现群聊和私聊的逻辑

三、实现群聊

1、服务端代码

  1. io.on("connection", (socket) => {
  2. console.log("有用户连接");
  3. // 自定义一个chat监听方法,当客户端发布到这个方法时,我们可以获取到发布的消息
  4. socket.on("chat", (msg) => {
  5. // broadcast: 是指你发送了消息,但是服务端会发送给除你之外的客户端,不会返回给你
  6. socket.broadcast.emit("advertise", msg);
  7. });
  8. });

2、客户端代码

先写一些基本样式,随意写一下用于发送消息就行了,主要还是围绕功能讲

  1. <template>
  2. <div class="chat">
  3. <div class="msgList">
  4. <div class="item"></div>
  5. </div>
  6. <div class="input">
  7. <input type="text" v-model="msg" />
  8. <div class="btn" @click="input">send</div>
  9. </div>
  10. </div>
  11. </template>
  12. <style scoped lang="scss">
  13. .chat {
  14. > .input {
  15. position: absolute;
  16. bottom: 10px;
  17. left: 0;
  18. right: 0;
  19. margin: 0 10px;
  20. display: flex;
  21. > input {
  22. flex: 1;
  23. padding-left: 5px;
  24. }
  25. > .btn {
  26. background: #999;
  27. padding: 3px 5px;
  28. margin-left: 10px;
  29. border-radius: 3px;
  30. }
  31. }
  32. }
  33. </style>

js代码

  1. <script>
  2. export default {
  3. data() {
  4. let msg = "";
  5. return { msg };
  6. },
  7. methods: {
  8. // 发布消息方法
  9. send() {
  10. // 将发布到服务端
  11. // 在服务端我们已经写好了对应的监听方法,只要有消息发布到服务端就会被接收到
  12. this.$socket.emit("chat", this.msg);
  13. // 清空输入框
  14. this.msg = "";
  15. },
  16. },
  17. // socket内置的钩子,用来监听服务端发布的方法
  18. sockets: {
  19. // 在服务端自定义的发布方法
  20. advertise(msg) {
  21. // 如果监听到服务端发来的信息,输出到控制台,这里可以写自己的业务逻辑
  22. console.log(msg);
  23. },
  24. },
  25. };
  26. </script>

尝试一下

先是输入消息,然后点击send按钮,结果如下

在别的客户端接收到了消息打印在控制台中,并且发布消息的客户端没有监听到消息,至此我们就实现了群聊功能。

但是上述的群聊并非真正意义上的群聊,只是类似广播的功能,将信息发布到全部客户端中,可以用来做类似广场这样的功能;而群聊应该是创建一个聊天室,跟socket.io中的room属性有关,等后面再介绍这个功能。

这篇文章暂时写到这里,这两天会继续更新私聊的功能;下篇文章会讲到如何在宝塔中部署node项目并让你的代码在生产环境中正常运行,最后会在发布一篇有关群聊的文章,如果有疑惑可以在评论区留言,我每天都会追踪最新动态,如果有帮助就留下你的赞或关注吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/761344
推荐阅读
相关标签
  

闽ICP备14008679号