58.websoket实现的客服 实现了发文字消息和图片

客户端是用react实现的,

关键代码 websoket

class WS {
    constructor() {
        this.ws = null;
        this.openHandler = null;
        this.messageHandler = null;
        this.errorHandler = null;
        this.closeHandler = null;

        this.requestId = 0;
        this.messageQueue = [];
        this.msgCheckTimer = setInterval(this.onTimer.bind(this), 1000);
        this.Timeout = 15000;
    }

    onTimer() {
        let isTimeout = false;
        let now = Date.now();
        for (let i = 0; i < this.messageQueue.length; i++) {
            let msg = this.messageQueue[i];
            let deltaTime = msg.time - now;
            if (deltaTime > this.TimeOut) {
                isTimeout = true;
                break;
            }
        }
        if (isTimeout)
            this.close();
    }

    open(url) {
        console.log('open')
        this.ws = new WebSocket(url);

        this.ws.onopen = function (event) {
            console.log('open-->', event)
            if (this.openHandler != null)
                this.openHandler(event);
        }.bind(this)

        this.ws.onmessage = function (event) {
            console.log('onmessage')
            if (this.messageHandler != null)
                this.messageHandler(event);
        }.bind(this);

        this.ws.onerror = function (event) {
            console.log('onerror-->', event)
            
            this.close();

            if (this.errorHandler != null)
                this.errorHandler(event);
        }.bind(this);

        this.ws.onclose = function (event) {
            console.log('onclose-->', event)
            this.close();

            if (this.closeHandler != null)
                this.closeHandler(event);
        }.bind(this);
    }

    close() {
        if (this.ws != null) {
            try {
                this.ws.close();
            } catch (e) {
            }
            this.ws = null;
            this.messageQueue = [];
        }
        if (this.msgCheckTimer != null) {
            clearInterval(this.msgCheckTimer);
            this.msgCheckTimer = null;
        }
    }

    makeMsg(commandId) {
        let json = {};
        json.account = sessionStorage.getItem('account');
        json.token = sessionStorage.getItem('token');
        json.commandId = commandId;
        json.requestId = this.requestId++;
        json.packType = PackType.RequestResponse;
        json.errorCode = ErrorCode.OK;
        return json;
    }

    send(commandId, subMsg, callback) {
        if (this.ws != null) {
            let msg = this.makeMsg(commandId);
            if (subMsg != null)
                msg.subMsgData = JSON.stringify(subMsg);
            let ss = JSON.stringify(msg);
            this.ws.send(ss);
            msg.time = Date.now();
            msg.callback = callback;
            this.messageQueue.push(msg);
        }
    }

    onResponse(responseMsg) {
        for (let i = 0; i < this.messageQueue.length; i++) {
            let msg = this.messageQueue[i];
            if (msg.requestId == responseMsg.requestId) {
                this.messageQueue.splice(i, 1);
                if (msg.callback != undefined)
                    msg.callback(responseMsg);
                break;
            }
        }
    }
}
openWS() {
            var url = "ws://" + wsAds + "/ws/crmclient";
            if (this.ws == null) {
                this.ws = new WS()

                this.ws.openHandler = function (event) {
                    this.setState({ wsOpenSuccess: true })
                    this.ws.send(MsgCommand.LoginCommand, null, this.getAllPlayers.bind(this));
                }.bind(this)

                this.ws.messageHandler = function (event) {
                    this.onmessage(event)
                }.bind(this)

                this.ws.errorHandler = function () {
                    this.setState({
                        isErr: true,
                        ntsType: 'reconnection',
                        ntsText: TextLand.OhErr
                    })
                }.bind(this)

                this.ws.closeHandler = function () {
                    this.setState({
                        isErr: true,
                        ntsType: 'reconnection',
                        ntsText: TextLand.OhDisconnect
                    })
                }.bind(this)
            } else {
                this.ws.close()
            }

            this.ws.open(url)
        },

 

posted @ 2018-02-05 11:51  famCc  阅读(372)  评论(0编辑  收藏  举报