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

news2024/10/2 1:37:22

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

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

npm install express

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

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);

app.get('/', (req, res) => {
  res.send('服务器搭好了');
});

app.get('/list', (req, res) => {
  res.send([
    { id: 1, name: 'Tom', age: 18 },
    { id: 2, name: 'Jerry', age: 12 },
    { id: 3, name: 'houseHolder', age: 30 }
  ]);
});

// 0.0.0.0 表示监听当前机器所有ip 包含本机ip和外网ip
server.listen(2000, '0.0.0.0', () => {
  console.log('127.0.0.1:2000');
});

3.运行服务器

node serve.js

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

npm install http-server

终端直接输入:http-server

4.测试服务器是否开启

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

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

npm install socket.io-client

6.创建websocket服务器

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);

+const { Server } = require("socket.io");
+// 创建了一个websocket服务器,并解决了跨域的问题
+const io = new Server(server, { cors: true });

+// 监听与客户端的连接事件
+io.on('connection', socket => {
  console.log('服务端连接成功');
  // 监听浏览器传过来的事件
  socket.on('handle', (e) => {
    console.log(e, 'app传过来的数据');
    socket.emit('message', e);
  })
})

app.get('/', (req, res) => {
  res.send('服务器搭好了');
});

app.get('/list', (req, res) => {
  res.send([
    { id: 1, name: 'Tom', age: 18 },
    { id: 2, name: 'Jerry', age: 12 },
    { id: 3, name: 'houseHolder', age: 30 }
  ]);
});

// npm install -g http-server查看所有ip  0.0.0.0 表示监听当前机器所有ip 包含本机ip和外网ip
server.listen(2000, '0.0.0.0', () => {
  console.log('127.0.0.1:2000');
});

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

<!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>
  <script src="https://cdn.socket.io/4.4.0/socket.io.min.js"></script>
</head>

<body>
  <input type="text" id="ipt" placeholder="请输入内容">
  <button id="btn">按钮</button>

  <script>
    let socket = io('ws://192.168.18.162:2000')
    // 监听浏览器、服务器是否建立连接
    socket.on('connect', () => {
      console.log('浏览器和服务器连接上了');
    })

    socket.on('message', (e) => {
      console.log(e, '服务器传过来的值');
    })

    const btn = document.querySelector('#btn')
    const ipt = document.querySelector('#ipt')
    btn.addEventListener('click', () => {
      console.log(ipt.value, 'input框信息');
      // 向服务器传递表单数据
      socket.emit('handle', ipt.value);
    })
  </script>
</body>

</html>

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

 

 

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

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

 

<!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>
  <script src="https://cdn.socket.io/4.4.0/socket.io.min.js"></script>
</head>

<body>
  <input type="text" id="ipt" placeholder="请输入内容">
  <button id="btn">按钮</button>

  <script>
    let socket = io('ws://192.168.18.162:2000')
    // 监听浏览器、服务器是否建立连接
    socket.on('connect', () => {
      console.log('浏览器和服务器连接上了');

      // 解决:断线重连
      console.dir(socket)
      socket.on('disconnect', () => {
        let intervalSocket = null
        intervalSocket = setInterval(() => {
          console.log("disconnect:" + socket.disconnected)
          if (socket.disconnected) {
            socket = io('ws://192.168.18.162:2000')
          } else {
            clearInterval(intervalSocket)
          }
        }, 3000)
      })

    })

    socket.on('message', (e) => {
      console.log(e, '服务器传过来的值');
    })

    const btn = document.querySelector('#btn')
    const ipt = document.querySelector('#ipt')
    btn.addEventListener('click', () => {
      console.log(ipt.value, 'input框信息');
      // 向服务器传递表单数据
      socket.emit('handle', ipt.value);
    })
  </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细stm32驱动SDRAM的注意事项以及在keil中的使用

SDRAM的主要参数&#xff1a; 容量&#xff1a;SDRAM的容量是指其可以存储的数据量&#xff0c;通常以兆字节&#xff08;MB&#xff09;或千兆字节&#xff08;GB&#xff09;为单位。 时钟频率&#xff1a;SDRAM的时钟频率指的是其内部时钟的速度&#xff0c;通常以兆赫&…

94. 二叉树的中序遍历

94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 (左根右)。 首先我们需要了解什么是二叉树的中序遍历&#xff1a;按照访问左子树——根节点——右子树的方式遍历这棵树&#xff0c;而在访问左子树或者右子树的时候我们按照同样的方式遍历…

MQTT协议-订阅主题和订阅确认

MQTT协议-订阅主题和订阅确认 SUBSCRIBE——订阅主题 订阅是客户端向服务端订阅 订阅报文 订阅报文与CONNECT报文类似&#xff0c;都是由固定报头可变报头有效载荷组成 固定报头比较简单&#xff0c;也是由两个字节组成&#xff0c;第一个字节为82&#xff0c;第二个字节是…

像素密度提升33%,Quest Pro动态注视点渲染原理详解

在Connect 2022上&#xff0c;Meta发布了Quest Pro&#xff0c;并首次在VR中引入动态注视点渲染&#xff08;ETFR&#xff09;功能&#xff0c;这是一种新型图形优化技术&#xff0c;特点是以用户注视点为中心&#xff0c;动态调节VR屏幕的清晰度&#xff08;注视点中心最清晰、…

Oracle VM VirtualBox6.1.36导入ova虚拟机文件报错,代码: E_INVALIDARG (0x80070057)

问题 运维人员去客户现场部署应用服务&#xff0c;客户是windows server 服务器&#xff08;客户不想买新机器&#xff09;&#xff0c;我们程序是在linux系统里运行&#xff08;其实windows也可以&#xff0c;主要是为了保持各地环境一致方便更新和排查问题&#xff09;我们使…

吐血整理学习方法,2年多功能测试成功进阶自动化测试,月薪23k+......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试进阶方向 测试进…

[Gin]框架底层实现理解(三)

1.engine.Run(port string) 这个就是gin框架的启动语句&#xff0c;看看就好了&#xff0c;下面我们解析一下那个engine.Handler() listenandserve 用于启动http包进行监听&#xff0c;获取链接conn // ListenAndServe listens on the TCP network address addr and then ca…

【SOP 】配电网故障重构方法研究【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java中wait和sleep区别

文章目录1. Java中wait和sleep区别2. wait和sleep所属方法的不同3. wait的Demo3.1 没有synchronized同步代码块异常3.2 wait使用Demo4. sleep的Demo1. Java中wait和sleep区别 sleep属于Thread类中的static方法&#xff1b;wait属于Object类的方法sleep时线程状态进入TIMED_WAI…

java 如何实现在线日志

如何采集springboot日志至web页面查看 实现方案 基于Filter方式,在日志输出至控制台前,LoggerFitler 拦截日志通过websocket推送至前台页面 实现逻辑&#xff1a; LoggerFilter采集日志添加至LoggerQueue队列, LoggerConsumer 从LoggerQueue中采集推送至前台页面 #mermaid-s…

LearnOpenGL-光照-3.材质

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject 文章目录材质例子1代码相关光照太强了例子2例子3: 不同的光源颜色材质 引出材质 如果我们想要在OpenGL中模拟…

TTS | 语音合成常见数据集及数据格式详情

linkLJSpeech网址 &#xff1a; The LJ Speech Dataset (keithito.com)数据集描述&#xff1a;数据集大小&#xff1a;2.6GB这是一个公共领域的语音数据集&#xff0c;由 13&#xff0c;100 个简短的音频剪辑组成 一位演讲者阅读 7 本非小说类书籍的段落。为每个剪辑提供转录。…

删除的文件怎么恢复?恢复方法在这里(支持Win和Mac)

案例&#xff1a;文件永久删除还能找回来吗&#xff1f;关于Win和Mac系统的恢复方法 “前几天我在清理电脑垃圾&#xff0c;不小心误删了重要的文件。有没有什么比较全面的方法&#xff0c;可以帮助我恢复删除的文件啊&#xff1f;在线急等回复&#xff01;” 随着电脑使用的…

Golang 中 Slice的分析与使用(含源码)

文章目录1、slice结构体2、slice初始化3、append操作4、slice截取5、slice深拷贝6、值传递还是引用传递参考文献众所周知&#xff0c;在golang中&#xff0c;slice&#xff08;切片&#xff09;是我们最常使用到的一种数据结构&#xff0c;是一种可变长度的数组&#xff0c;本篇…

三维人脸实践:基于Face3D的渲染、生成与重构 <二>

face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 3DMM方法&#xff0c;基于平均人脸模型&#xff0c;可广泛用于基于关键点的人脸生成、位姿检测以及渲染等&#xff0c;能够快速实现人脸建模与渲染。推…

MySQL基础篇3

第一章 多表关系实战 1.1 实战1&#xff1a;省和市 方案1&#xff1a;多张表&#xff0c;一对多 方案2&#xff1a;一张表&#xff0c;自关联一对多 id1 name‘北京’ p_id null; id2 name‘昌平’ p_id1 id3 name‘大兴’ p_id1 id3 name‘上海’ p_idnull id4 name‘浦东’…

中国人工智能企业中集飞瞳全球港航人工智能领军者,箱况残缺检测视频流动态感知智能闸口,自动化港口码头数字化智慧港航中国人工智能企业

中国人工智能企业中集飞瞳全球港航人工智能领军者&#xff0c;箱况残缺检测视频流动态感知超级智能闸口&#xff0c;自动化港口码头数字化智慧港航。CIMCAI已完成全球250万人工智能集装箱箱况检验&#xff0c;完成全球上亿集装箱信息&#xff0c;先进产品在全球各港区及集装箱枢…

CNStack 多集群服务:基于 OCM 打造完善的集群管理能力

作者&#xff1a;学靖 概述 随着 Kubernetes 在企业业务中的应用和发展&#xff0c;单集群内的管理能力已经趋于完善&#xff0c;越来越多的客户期望在多云、多集群场景部署其业务&#xff0c;因此需要提供相应的多云、多集群管理能力。 CNStack 多集群服务是 CNStack 面向多…

【实现“大图”功能 Objective-C语言】

一、这时候,我们来实现另外一个功能,就是点击,实现这个“大图”, 1.点击“大图”按钮,实现这个“大图”, 那么我先给大家说一下,这个点击“按钮”,实现“大图”,这个思路是怎样的,大家看一下,这个示例程序,当你点击“大图”的时候,首先,这个图片变大,同时,后…

Nvidia jetson nano 部署yolov5_技术文档

Nvidia jetson nano 部署yolov5_技术文档 每天一句小姜格言&#xff1a;我行&#xff0c;我不是一般人儿 部署开始&#xff1a; 1、通过FileZilla&#xff0c;将window文件传输至jetson nano 上的nano文件夹下。 2、查看cuda 我买的jetson nano是带有配置好的镜像。系统配置…