资讯专栏INFORMATION COLUMN

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

Acceml / 1608人阅读

摘要:前奏这篇文章仅对不熟悉在中使用的人以及入门者有帮助。基本介绍想要实现一种实时的双向通信聊天系统,你可能会想到轮询长或短,但你最想要的还是的实现。客户端的实现端的实现,才是我们应该关注的重点。

前奏

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92097.html

相关文章

  • React Native 网络层分析

    摘要:内置了三种发送网络请求的方式和。转换二进制为发送到目前为止,不能发送非序列化的数据,所以,要发送二进制数据,采用编码的字符串是个不错的选择。在最新版本的层也已经支持协议来传输二进制文件,但是,相应的原生平台的网络模块暂时还不支持。 端) 本文原创,转载请注明作者及出处 在使用React Native开发中,我们熟练的采用JavaScript的方式发送请求的方式发送一个请求到服务端,但是...

    elva 评论0 收藏0
  • websocket学习和群聊实现

    摘要:协议可以实现前后端全双工通信,从而取代浪费资源的长轮询。而就可以使得前后端进行全双工通信两方都可以向对方进行数据推送,是真正的平等对话。 WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询。在此协议的基础上,可以实现前后端数据、多端数据,真正的实时响应。在学习WebSocket的过程中,实现了一个简化版群聊,过程和代码详细记录在这篇文章中。 本篇文章来自董沅鑫的...

    fantix 评论0 收藏0
  • 前端每周清单第 38 期: Node 9 发布,Kotlin 与 React,Netflix 架构解

    摘要:发布本周正式发布,包含了一系列的特性提升与问题修复,同时也在不断致力于将打造地更为轻巧与高性能。当然,姜振勇老师还会介绍的多种服务,包括大数据网络和安全,展现弹性安全和高可扩展性的全方位能力。 showImg(http://upload-images.jianshu.io/upload_images/1647496-2ce7598e6987d9af.jpg?imageMogr2/aut...

    Carbs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<