前奏

这篇文章仅对不熟悉在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、最后说一句,这些都是基础知识。

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

  1. Websocket 群聊功能

    websocket 群聊 前提关闭防火墙 写入代码 from flask import Flask,request,render_template from geventwebsocket.handl ...

  2. WebSocket群聊与单聊

    一 . WebSocket实现群聊 py文件代码 # py文件 from flask import Flask, render_template, request from geventwebsock ...

  3. websocket 群聊单聊

    websocket 介绍 介绍引自 https://segmentfault.com/a/1190000012709475 群聊 from flask import Flask, request, r ...

  4. websocket 群聊,单聊,加密,解密

    群聊 from flask import Flask, request, render_templatefrom geventwebsocket.handler import WebSocketHan ...

  5. 4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)

    你好,我是彤哥,本篇是netty系列的第四篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使 ...

  6. Asp.net SignalR 应用并实现群聊功能 开源代码

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  7. WebSocket+Java 私聊、群聊实例

    前言 之前写毕业设计的时候就想加上聊天系统,当时已经用ajax长轮询实现了一个(还不懂什么是轮询机制的,猛戳这里:https://www.cnblogs.com/hoojo/p/longPolling ...

  8. 群里分享的react的收藏一下!今日周末,改了个表单验证然后无所事事了!

    今日周末,改了个表单验证然后无所事事了,然后把昨天群里分享的react的收藏一下尽管现在还在研究angular和nodeJs毕竟刚刚开始用有点不熟...没准以后会研究一下react毕竟看着下面这张图还 ...

  9. 一例完整的websocket实现群聊demo

    前言 业余我都会花一些时间在tcp.http和websocket等领域的学习,现在觉得有点收获,所以把一个基于websocket的群聊功能的例子提供给大家玩玩.当然这是一个很完整的例子,包括webso ...

随机推荐

  1. [ Skill ] 文件读写 & IO 句柄

    https://www.cnblogs.com/yeungchie/ 在 Skill 中使用一种叫做 ioport 类型的变量来操作文件.不过我一般更习惯称为 IO 句柄 (IO/File Handl ...

  2. javascript订阅模式浅析和基础实例

    前言 最近在开发redux或者vux的时候,状态管理当中的createStore,以及我们在组件中调用的dispatch传递消息给状态管理中心,去处理一些操作的时候,有些类似我们常见到订阅模式 于是写 ...

  3. jq全选、全不选、反选、单删、批量删除

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  4. JS-购物车

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. V8 引擎的垃圾回收机制

    V8 引擎将内存分为新生代和老生代 由于不同对象的生存周期不同,只用一种回收策略来解决问题,这样效率会很低.所以V8采用了一种代回收的策略,将内存分为两个生代:新生代(new generation)和 ...

  6. Go 1.18 最强代码自测方法!

    特别说明:这个真的不是标题党,我写代码20+年,真心认为 go fuzzing 是我见过的最牛逼的代码自测方法.我在用 AC自动机 算法改进关键字过滤效率(提升~50%),改进 mapreduce 对 ...

  7. mq消息堆积处理

    1.大量消息在mq里积压 场景:几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上很晚,10点多,11点多.线上故障了,这个时候要不然就是修复consumer的问题,让他恢复消费速度,然 ...

  8. 给R语言RStudio添加阿里云镜像源

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 方法一: 打开RStudio,输入options()$repos查看默认镜像源情况 options()$repos 打开tools工具栏,找到Glo ...

  9. k8s.gcr.io、gcr.io仓库的镜像下载

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 获取这类镜像的方法一般有2种: 1.通过拉取国内镜像仓库的内容(操作简单直接拉取即可,缺点是镜像的版本更新可能较慢,可能无法获取最新的镜像) 2 ...

  10. 如何运行MATLAB和C++混合编程

    在GitHub下载了一个大佬的滤波器程序,包含MATLAB和C++,刚开始直接运行,发现提示如下: 然后,第一步:点击截图访问后面的链接,跳转到如下截图: 第二步:点击上面截图的左下角,R2015b版 ...