React系列——websocket群聊系统在react的实现

2023-05-16

前奏

这篇文章仅对不熟悉在react中使用socket.io的人、以及websocket入门者有帮助。

下面这个动态图展示的聊天系统是用react+express+websocket搭建的,很模糊吧,要得就是这样的效果,我自己开了2个窗口,创建2个用户自问自答。没有什么高深的技术,对于很多想接触websocket的前端工程师来说,不擅长后端的websocket代码可能是硬伤。

图片描述

开发环境

服务端:express服务器

客户端:react技术栈,开发环境采用前端服务器的方式,打包后将静态资源放到服务端目录下做测试。

基本介绍

想要实现一种实时的双向通信聊天系统,你可能会想到ajax轮询(长或短),但你最想要的还是websocket的实现。

在写测试代码之前,我纠结于前端用什么,后端用什么,后来后端选择了express、前端是react。

1、服务端使用到的js库

express

socket.io

2、前端使用到的js库

"react": "^16.2.0",
"react-dom": "^16.2.0",
"socket.io-client": "^2.0.4"

express服务端的实现

服务端的实现我不想多讲,你可以去看官方demo,代码很详细:socket官方demo实现

服务端的核心代码:

io.on('connection', function (socket) {
    // 当客户端发出“new message”时,服务端监听到并执行相关代码
    socket.on('new message', function (data) {
        // 广播给用户执行“new message”
        socket.broadcast.emit('new message', {});
    });
    
    // 当客户端发出“add user”时,服务端监听到并执行相关代码
    socket.on('add user', function (username) {
        socket.username = username;
        //服务端告诉当前用户执行'login'指令
        socket.emit('login', {});
    });
    
    // 当用户断开时执行此指令
    socket.on('disconnect', function () {});
});

socket和mongodb有点像,它需要创建一个socket服务,创建成功之后,就可以通过on()去监听一个action,action在这里表示的是 'new message'、'add user'、'login'等指令,这些指令是可以自己命名的。

这些指令有什么作用呢?

当客户端和服务端建立socket通信之后,服务端可以向客户端发出指令,客户端也可以向服务端发出指令,开发者需要先给双方的通信约定一套指令系统。

比如服务端创建了一个 'new message'的指令,但是客户端没有创建这个指令,就会导致客户端无法接收到服务端发出的这个指令。客户端心里可能在想:服务端老兄在瞎bb什么?

客户端也需要 ’new message’指令,这样双方就能达成一套通信的协议,双方可以互相发出这条指令告诉对方最新的状态。

上面代码提到了socket.emit()和socket.broadcast.emit()2种用法,可以看看下面关于emit用法的详细解释。

// 发送到当前请求socket通信的客户端
socket.emit('message', "this is a test");

// 发送给所有客户端,除了发件人
socket.broadcast.emit('message', "this is a test");

// 发送给“游戏”房间(频道)中的所有客户,发件人除外
socket.broadcast.to('game').emit('message', 'nice game');

// 发送给所有的客户,包括发件人
io.sockets.emit('message', "this is a test");

// 发送给“游戏”房间(频道)的所有客户,包括发件人
io.sockets.in('game').emit('message', 'cool game');

// 发送给指定的socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');

socket的这种行为更像是redux,但是redux是单向数据流,而socket是双向。

React客户端的实现

React端的实现,才是我们应该关注的重点。

作为一个前端工程师,往往只需要和后端大神配合即可(全栈除外)。

1、在react组件中导入socket.io-client

前端使用的是socket.io-client库,这个库使用非常简单。下面的代码中,直接导入socket.io-client并且指向服务端的ip+端口即可。

import React, { Component } from 'react'

//require('socket.io-client')('服务端ip+端口')
const socket = require('socket.io-client')('http://localhost:3077');

class App extends Component {
    
}

2、在componentDidMount写socket的接收指令action

socket.on()设置了服务端约定好的指令,当服务端发出这些指令时,客户端就能接收到。这时候,你可以在回调函数里面根据后端返回的数据 data 做前端的处理,比如设置state的状态,渲染服务端推送的数据。

componentDidMount() {
        socket.on('login', (data) => {
            console.log(data)
        });
        socket.on('add user', (data) => {
            console.log(data)
        });
        socket.on('new message', (data) => {
            console.log(data)
        });
    }

3、客户端推送数据到服务端

很多时候,客户端也需要告诉服务端有新的数据更新,当你在聊天界面发了一条新消息,这时候要告诉服务端,就通过socket.emit()方法,和服务端推送的方法是一样的。

socket.emit('new message', value)

总结

1、当你想要告诉对方一些话时,使用socket.emit()。

2、当你想接收对方的话时,使用socket.on()。

3、emit还有点对点、广播等用法。

4、最后说一句,这些都是基础知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React系列——websocket群聊系统在react的实现 的相关文章

  • MongoDB中yaml模式配配置文件详解

    mongodb3 x版本后就是要yaml语法格式的配置文件 xff0c 下面是yaml配置文件格式如下 xff1a 官方yaml配置文件选项参考 xff1a https docs mongodb org manual configurati
  • java 正则表达式提取字符串

    参考文档 xff1a baijiahao baidu com s id 61 159862 如果需要提取的字符串没有好的规则 xff0c 则直接用点 其他部分剩下的就是自己需要提取的 Pattern p 61 Pattern compile
  • 【成功】qlv转MP4,超简单方法

    1 打开 www xxxbbbttt com 上传你的视频 xff08 腾讯qlv xff0c 爱奇艺qsv 优酷kux xff09 都可以 3 点击转换按钮 xff0c 转换好后 xff0c 我们把转换的视频下载到电脑里 xff0c 就可
  • cisco配置交换机管理地址和默认网关

    配置交换机远程管理地址和默认网关 拓扑图如下 xff1a 1 配置PC0 2 配置SW1交换机 Switch config no ip domain lookup 关闭域名解析 Switch config line exec timeout
  • 兄弟们,请求支援,怎么实现互通,全部都互通的

    转载于 https blog 51cto com 14155986 2337267
  • FIFO算法与LRU算法软考试题

    转载于 https www cnblogs com kungfupanda archive 2009 12 25 1632106 html
  • iOS 网络/本地 图片 按自定义比例缩放 不失真 方法

    我尝试了很多种方法 xff0c 终于 xff0c 设计了一个方法 xff0c 能按自己规定的大小压缩 还没失真 如果以后不好用 我再升级 分享给大家 xff1a 43 CGRect scaleImage UIImage image toSi
  • java 输入输出 函数对象构造

    输入输出 输入字符串 不包括最后的换行符 39 n 39 import java io BufferedReader import java io IOException 输入字符一个char import java io InputStr
  • Python 3 加密简介

    Python 3 的标准库中是没多少用来解决加密的 xff0c 不过却有用于处理哈希的库 在这里我们会对其进行一个简单的介绍 xff0c 但重点会放在两个第三方的软件包 xff1a PyCrypto 和 cryptography 上 xff
  • grep 命令的基本使用

    环境变量 xff1a 定义用户的工作环境某个方面的属性 文本文件的查看命令 xff1a cat 连接 能够将后面跟的多个文件的内容 xff0c 依次显示 cat n 在显示时出现行号 E 显示行结束符 v 显示非打印字符不显示制表符tab
  • innodb Cardinality学习笔记

    github 传送门 链接描述 欢迎过来star呀 背景 1 之前对innodb的Cardinality没概念 xff0c 只知道要高选择性的列上建索引 xff0c 比如用户名而不是性别 xff0c 因为性别区分度不高 xff0c 但是这过
  • K8S组件运行原理详解总结

    一 看图说K8S 先从一张大图来观看一下K8S是如何运作的 xff0c 再具体去细化K8S的概念 组件以及网络模型 从上图 xff0c 我们可以看到K8S组件和逻辑及其复杂 xff0c 但是这并不可怕 xff0c 我们从宏观上先了解K8S是
  • ubuntu中apt-get的常用命令。

    使用以下命令清理系统垃圾 sudo apt get autoclean 清理旧版本的软件缓存 sudo apt get clean 清理所有软件缓存 sudo apt get autoremove 删除系统不再使用的孤立软件 xff1d x
  • Qt之设置QWidget背景色

    简述 QWidget是所有用户界面对象的基类 xff0c 这意味着可以用同样的方法为其它子类控件改变背景颜色 Qt中窗口背景的设置 xff0c 下面介绍三种方法 使用QPalette 使用Style Sheet绘图事件 一般我不用QSS设置
  • 计算机机房英文术语,【数据中心】数据中心常见中英术语及解释

    原标题 xff1a 数据中心 数据中心常见中英术语及解释 一 常见中文术语 1 数据中心 为一个建筑群 建筑物或建筑物中的一个部分 xff0c 主要用于容纳设置计算机房及其支持空间 2 进线间 外部缆线引入和电信业务经营者安装通信设施的空间
  • C#学习之接口

    什么是接口 xff1f 其实 xff0c 接口简单理解就是一种约定 xff0c 使得实现接口的类或结构在形式上保持一致 个人觉得 xff0c 使用接口可以使程序更加清晰和条理化 xff0c 这就是接口的好处 xff0c 但并不是所有的编程语
  • neo1973 audio subsystem

    fhttp wiki openmoko org wiki Neo 1973 audio subsystem using Bluetooth headset with GSM NOTE none of this works with GTA0
  • 程序员面试必备书单

    点击关注异步图书 xff0c 置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论 xff0c 即有机会获得异步图书一本 世上最快乐的事 xff0c 莫过于为理想奋斗 一个满意的工作 xff0c 便是为理想奋斗
  • vnc linux 终端打不开,vnc连接后只能看到终端

    我在windows安装了VNC Viewer xff0c 远程链接ubunt12 04服务器 xff0c 发现远程桌面只有一个终端 xff0c 没有桌面 从网上查了一些资料 xff0c 问题得以解决 xff0c 记录如下 xff1a 修改
  • ubuntu11.04下CUDA4.0的安装与配置

    ubuntu11 04下CUDA4 0的安装与配置 1 xff1a 下载CUDA 4 0 安装官网最新的显卡驱动 xff1a 安装方法可以参考 xff1a Ubuntu11 04下安装Nvidia显卡驱动的方法 然后从NVIDIA网站 xf

随机推荐