1. 程式人生 > >58.websoket實現的客服 實現了發文字消息和圖片

58.websoket實現的客服 實現了發文字消息和圖片

msg open set error esp comm ucc sgd interval

客戶端是用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)
        },

58.websoket實現的客服 實現了發文字消息和圖片