socket.io-client 實時通訊,用socket.io-client的坑

前言:


由於項目需要,前端所渲染的數據,要從後端(PHP)實時主動推送到前端(前端也可以實時主動推送到後端,以前的做法是在前端用定時任務,隔多少時間後就請求一下後端API),所以就不像平時用Ajax、Fetch、Axios等來調用後端的API接口了,這次採用的是WebSocket方式(什麼是WebSocket),現在的WebAPI中本身就支持WebSocket的,所有可以前端可以直接調,但是使用WebSocket還要搭建後端服務等,

由於這次項目比較急,所以就接用了第三方封好的框架:Workerman

workerman是一個高性能的PHP socket 服務器框架,workerman基於PHP多進程以及libevent事件輪詢庫,PHP開發者只要實現一兩個接口,便可以開發出自己的網絡應用,例如Rpc服務、聊天室服務器、手機遊戲服務器等。

workerman的目標是讓PHP開發者更容易的開發出基於socket的高性能的應用服務,而不用去了解PHP socket以及PHP多進程細節。 workerman本身是一個PHP多進程服務器框架,具有PHP進程管理以及socket通信的模塊,所以不依賴php-fpm、nginx或者apache等這些容器便可以獨立運行。

Workerman:下載地址:https://www.workerman.net/download

Workerman:官方文檔:http://doc.workerman.net

提示,我遇到坑的地方 或 要注意的地方,我都用紅色字體標註了。

 

安裝:


這次前端是用React-cli v16來做的,所以直接npm 或 yarn 就可以直接安裝在項目中了!!!

npm install socket.io-client

或

yarn add socket.io-client

 

注:安裝完成後一定要重新啓動一下React服務(npm run start 或 yarn start)

不然在 引入時 import io from 'socket.io-client'; 會有報錯!!!

 

使用:


 

import React, { Component } from "react";
import io from 'socket.io-client';

export default class Main extends Component {
    constructor(props) {
        super(props);
        this.state = {
            news: []
        };
    };

    getNews() {

        //和後端服務建立鏈接
        const socket = io('ws://10.0.3.69:8442');

        //監聽後端推送過來的數據(注,init是可以自定義的,只要和後端約定好可行了!!)
        socket.on('init', (data) => {

            console.log(data); //這是後端推送過來的數據

            this.setState({
                news: data
            });
        });



        let msg = '我是前端向後端發送的數據!!';

        //向後端發送數據
        socket.emit('send', { text: msg});
        
        //後端在接收時也就是監聽send就可以得到前端傳過來的數據了

    };

    componentWillMount() {
        this.getNews();
    };

    componentDidMount() {    

    };

    render() {
        return (
            <section className="main">
                <ul className="news-box">
                    <li>
                        {
                            this.state.news.map((item, index) =>{
                                return (`<b>${item.num}</b> <span>${item.content}</span>`)
                            })
                        }
                    </li>
                </ul>
               
            </section>
        );
    };
};

 

方法說明:


socket.on()方法:

    - socket.on()用於監聽獲取服務端(後端)發送過來的數據

    - socket.on('monitorName', callBack)有兩個參數:

        + monitorName:是監聽的標識,是自定義的,只要和後端約定好可行了!!)

        + callBack:是一個回調函數,裏面的參數就是後端發送過來的數據

 

socket.emit()方法:

    - socket.emit()用於向服務端(後端)發送數據

    - socket.emit('monitorName', sendData)有兩個參數:

        + monitorName:是監聽的標識,是自定義的,只要和後端約定好可行了!!)

        + sendData:可以是字符串,也可以是{}JSON對象,這是向後端發送過去的數據


 

socket.on()方法 和 socket.emit()方法 在前後端是成對出現的!!!

 

    後端向前端推送數據時,前後端的寫法:

        後端:

            socket.emit('news', {data: [{id: 1, text: '我是向前端發送的新聞列表'}]});

 

        前端:

            socket.on('news', function(data) { 

                console.log(data)

            });

 

   前端向後端推送數據時,前後端的寫法:

        後端:

           socket.on('send', function(data) { 

                console.log(data)

            });

           

        前端:

             socket.emit('send', {uid: 'mu-2018', name: 'myName', text: '我是向後端發送的數'});

 

後端在向前端發送時定義的標識是 news,前端在接收時也是news

前端在向後端發送時定義的標識是 send,後端在接收時也是send

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章