当前位置:   article > 正文

如何通过websoket实现即时通讯+断线重连?_websocket断线重连

websocket断线重连

本篇博客只是一个demo,具体应用还要结合项目实际情况,以下是目录结构

1.首先通过express搭建一个本地服务器

npm install express

2.在serve.js中自定义测试数据 

  1. const express = require('express');
  2. const app = express();
  3. const http = require('http');
  4. const server = http.createServer(app);
  5. app.get('/', (req, res) => {
  6. res.send('服务器搭好了');
  7. });
  8. app.get('/list', (req, res) => {
  9. res.send([
  10. { id: 1, name: 'Tom', age: 18 },
  11. { id: 2, name: 'Jerry', age: 12 },
  12. { id: 3, name: 'houseHolder', age: 30 }
  13. ]);
  14. });
  15. // 0.0.0.0 表示监听当前机器所有ip 包含本机ip和外网ip
  16. server.listen(2000, '0.0.0.0', () => {
  17. console.log('127.0.0.1:2000');
  18. });

3.运行服务器

node serve.js

注:如何查看所有ip ?(本地+外网ip)

npm install http-server

终端直接输入:http-server

4.测试服务器是否开启

发送请求,可以拿到返回的数据,服务器开启成功

 5.通过 socket.io-client 实现客户端代码

npm install socket.io-client

6.创建websocket服务器

  1. const express = require('express');
  2. const app = express();
  3. const http = require('http');
  4. const server = http.createServer(app);
  5. +const { Server } = require("socket.io");
  6. +// 创建了一个websocket服务器,并解决了跨域的问题
  7. +const io = new Server(server, { cors: true });
  8. +// 监听与客户端的连接事件
  9. +io.on('connection', socket => {
  10. console.log('服务端连接成功');
  11. // 监听浏览器传过来的事件
  12. socket.on('handle', (e) => {
  13. console.log(e, 'app传过来的数据');
  14. socket.emit('message', e);
  15. })
  16. })
  17. app.get('/', (req, res) => {
  18. res.send('服务器搭好了');
  19. });
  20. app.get('/list', (req, res) => {
  21. res.send([
  22. { id: 1, name: 'Tom', age: 18 },
  23. { id: 2, name: 'Jerry', age: 12 },
  24. { id: 3, name: 'houseHolder', age: 30 }
  25. ]);
  26. });
  27. // npm install -g http-server查看所有ip 0.0.0.0 表示监听当前机器所有ip 包含本机ip和外网ip
  28. server.listen(2000, '0.0.0.0', () => {
  29. console.log('127.0.0.1:2000');
  30. });

 7.在app/index.js中导入socket.io的cdn线上包,并连接本地服务器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.socket.io/4.4.0/socket.io.min.js"></script>
  9. </head>
  10. <body>
  11. <input type="text" id="ipt" placeholder="请输入内容">
  12. <button id="btn">按钮</button>
  13. <script>
  14. let socket = io('ws://192.168.18.162:2000')
  15. // 监听浏览器、服务器是否建立连接
  16. socket.on('connect', () => {
  17. console.log('浏览器和服务器连接上了');
  18. })
  19. socket.on('message', (e) => {
  20. console.log(e, '服务器传过来的值');
  21. })
  22. const btn = document.querySelector('#btn')
  23. const ipt = document.querySelector('#ipt')
  24. btn.addEventListener('click', () => {
  25. console.log(ipt.value, 'input框信息');
  26. // 向服务器传递表单数据
  27. socket.emit('handle', ipt.value);
  28. })
  29. </script>
  30. </body>
  31. </html>

8.连接成功客户端和服务器都可以获取input框的值

 

 9.优化:解决断线重连问题

思路:客户端在监听是否和服务端连接成功的函数中,监听断线函数,如果连接失败设置定时器每3s重新建立连接

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.socket.io/4.4.0/socket.io.min.js"></script>
  9. </head>
  10. <body>
  11. <input type="text" id="ipt" placeholder="请输入内容">
  12. <button id="btn">按钮</button>
  13. <script>
  14. let socket = io('ws://192.168.18.162:2000')
  15. // 监听浏览器、服务器是否建立连接
  16. socket.on('connect', () => {
  17. console.log('浏览器和服务器连接上了');
  18. // 解决:断线重连
  19. console.dir(socket)
  20. socket.on('disconnect', () => {
  21. let intervalSocket = null
  22. intervalSocket = setInterval(() => {
  23. console.log("disconnect:" + socket.disconnected)
  24. if (socket.disconnected) {
  25. socket = io('ws://192.168.18.162:2000')
  26. } else {
  27. clearInterval(intervalSocket)
  28. }
  29. }, 3000)
  30. })
  31. })
  32. socket.on('message', (e) => {
  33. console.log(e, '服务器传过来的值');
  34. })
  35. const btn = document.querySelector('#btn')
  36. const ipt = document.querySelector('#ipt')
  37. btn.addEventListener('click', () => {
  38. console.log(ipt.value, 'input框信息');
  39. // 向服务器传递表单数据
  40. socket.emit('handle', ipt.value);
  41. })
  42. </script>
  43. </body>
  44. </html>

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

闽ICP备14008679号