React WebSocket 发送消息

1、实现效果

2、简单接收消息

只进行简单的接收消息,没有发送信息的需求。以下操作足够。如果需要发送信息。无需以下操作。

2.1、导入依赖

npm install react-websocket
	或 yarn add react-websocket

2.2 引入组件

import React from react;
import Websocket from react-websocket;

class ReactWebsocket extends React.Component {
          
   
  render() {
          
   
    return (
      <Websocket 
      		// 输入自己的url
        url="ws://127.0.0.1:8080/api/pushMessage/001"  
        onMessage={
          
   (msg:any)=>{
          
       
          console.log(msg)								// 接收消息
        }}
        // 其余属性省略(具体配置看源码)
        />
    );
  }
}

export default ReactWebsocket;

3、发送消息

如果需要发送信息,上述组件没有暴露发送信息的函数,所以发送信息就会比较麻烦。下文我重写了上述组件,实现了开头的效果。无需导入 react-websocket 包,只需复制以下代码,按照需求小改即可。
import React from react;
import {
          
    Input,message  } from antd;
import PropTypes from prop-types;
const {
          
    Search } = Input;


/**
 * 封装 ReactWebsocket
 */
 // 自己的url
const url="ws://127.0.0.1:8080/api/pushMessage/001"
// 是否重连
const reconnect=false
const reconnectIntervalInMilliSeconds=1000

class ReactWebsocket extends React.Component{
          
   
    constructor(props) {
          
   
        super(props);
        this.state = {
          
   
            ws:new WebSocket(url),
            reconnect:reconnect,
        };
        this.sendMessage = this.sendMessage.bind(this);
        this.setupWebsocket = this.setupWebsocket.bind(this);
    }

    sendMessage(msg) {
          
   
        this.state.ws.send(msg)
        message.info("消息已发送!")
        }

    setupWebsocket() {
          
   
        this.state.ws.onopen = () => {
          
   
            console.log("开启websocket")
            this.state.ws.send("客户端websocket已开启" )
        }
        this.state.ws.onerror=e=>{
          
   
            console.log("发生错误:"+e)
        }
        this.state.ws.onmessage=evt=>{
          
   
            this.props.onMessage(evt.data);
        }

        this.state.ws.onclose=evt=>{
          
   
            console.log("Websocket关闭连接,原因:}"+evt.reason+"错误代码:"+evt.code)
        }
        if(reconnect){
          
   
            console.log("正在重新连接")
            this.timeoutID= setTimeout(() => {
          
   
                this.setState({
          
   
                    ws: new WebSocket(url)
                });
                this.state.ws.onopen = () => {
          
   
                    console.log("重启websocket")
                }
            }, reconnectIntervalInMilliSeconds);
        }
    }
    
    componentDidMount() {
          
   
        this.setupWebsocket();
    }
    componentWillUnmount() {
          
   
        this.state.ws.close()
    }

    render() {
          
   
        // 以下的自己改
        return <Search
                placeholder="输入消息"
                allowClear
                enterButton="点击发送"
                size="large"
                onPonPressEnter={
          
   (message) => {
          
   
                    this.sendMessage(message)
                }}
                onSearch={
          
   (message) => {
          
   
                    this.sendMessage(message)
                }}
            />
    }
}
ReactWebsocket.propTypes = {
          
   
    onMessage: PropTypes.func.isRequired,
};
export default ReactWebsocket;

在页面引入上述组件:

<ReactWebsocket
   onMessage={
          
   (msg:any)=>{
          
   
        message.info("收到消息:"+msg)
    }}
/>

ok

经验分享 程序员 微信小程序 职场和发展