react使用websocket实时通信

在react中使用websocket不需要引入其他库,只需要创建一个公共组件,封装一下websocket

创建公共组件

websocket.js

let websocket, lockReconnect = false;
let createWebSocket = (url) => {
    websocket = new WebSocket(url);
    websocket.onopen = function () {
       heartCheck.reset().start();
    }
    websocket.onerror = function () {
        reconnect(url);
    };
    websocket.onclose = function (e) {
        console.log('websocket 断开: ' + e.code + ' ' + e.reason + ' ' + e.wasClean)
    }
    websocket.onmessage = function (event) {
        lockReconnect=true;
        //event 为服务端传输的消息,在这里可以处理
    }
}
let reconnect = (url) => {
    if (lockReconnect) return;
    //没连接上会一直重连,设置延迟避免请求过多
    setTimeout(function () {
        createWebSocket(url);
        lockReconnect = false;
    }, 4000);
}
let heartCheck = {
    timeout: 60000, //60秒
    timeoutObj: null,
    reset: function () {
        clearInterval(this.timeoutObj);
        return this;
    },
    start: function () {
        this.timeoutObj = setInterval(function () {
            //这里发送一个心跳,后端收到后,返回一个心跳消息,
            //onmessage拿到返回的心跳就说明连接正常
            websocket.send("HeartBeat");
        }, this.timeout)
    }
}
//关闭连接
let closeWebSocket=()=> {
    websocket && websocket.close();
}
export {
    websocket,
    createWebSocket,
    closeWebSocket
};

在react组件中的使用

1、react 函数组件的使用

import {createWebSocket,closeWebSocket} from './websocket';
const Element=(param)=>{
	useEffect(()=>{
		let url="";//服务端连接的url
		createWebSocket(url)
		//在组件卸载的时候,关闭连接
		 return ()=>{
            closeWebSocket();
        }
	})
}

2、react 类组件中的使用

import {createWebSocket,closeWebSocket} from './websocket';
....
componentDidMount(){
 	let url="";//服务端连接的url
	createWebSocket(url)
 }
 componentWillUnmount(){
	 closeWebSocket();
}
....

如果一个连接,推送不同的消息如何处理?

1、需要安装 pubsub-js
2、修改webscocket.js 获取消息的代码

import { PubSub } from 'pubsub-js';
...
 websocket.onmessage = function (event) {
        lockReconnect=true;
        //event 为服务端传输的消息,在这里可以处理
        let data=JSON.parse(event.data);//把获取到的消息处理成字典,方便后期使用
        PubSub.publish('message',data); //发布接收到的消息 'message' 为发布消息的名称,data 为发布的消息
   }
   ...

3、在组件中的使用
函数组件中的使用(在类组件中类似)

import { PubSub } from 'pubsub-js';
useEffect(()=>{
	//订阅 'message' 发布的发布的消息
	messageSocket = PubSub.subscribe('message', function (topic,message) { 
		//message 为接收到的消息  这里进行业务处理
	})
	//卸载组件 取消订阅
	return ()=>{
          PubSub.unsubscribe(messageSocket); 
    }
}
  • 9
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要在 React TypeScript 中实现实时通信,可以使用 WebSocket 技术。下面是一个简单的示例,展示了如何使用 WebSocket 实现实时通信: ```typescript import React, { useState, useEffect } from 'react'; function ChatRoom() { const [messages, setMessages] = useState<string[]>([]); const [newMessage, setNewMessage] = useState<string>(''); useEffect(() => { const socket = new WebSocket('ws://localhost:8080'); socket.onopen = () => { console.log('WebSocket connected'); }; socket.onmessage = (event) => { const message = event.data; setMessages((prevMessages) => [...prevMessages, message]); }; socket.onclose = () => { console.log('WebSocket disconnected'); }; return () => { socket.close(); }; }, []); const handleNewMessage = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault(); setMessages((prevMessages) => [...prevMessages, newMessage]); const socket = new WebSocket('ws://localhost:8080'); socket.send(newMessage); setNewMessage(''); }; return ( <div> <ul> {messages.map((message, index) => ( <li key={index}>{message}</li> ))} </ul> <form onSubmit={handleNewMessage}> <input type="text" value={newMessage} onChange={(event) => setNewMessage(event.target.value)} /> <button type="submit">Send</button> </form> </div> ); } ``` 在上面的示例中,我们使用 `useState` 钩子来存储消息列表和输入框中的新消息。在 `useEffect` 钩子中,我们创建了一个 WebSocket 对象并通过 `onopen`、`onmessage` 和 `onclose` 方法来处理连接、接收消息和断开连接的事件。在 `handleNewMessage` 函数中,我们发送新消息到服务器并将其添加到消息列表中。最后,我们渲染了一个消息列表和一个输入框,使用户可以输入新消息并发送到服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值