Egret学习-websocket使用

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输

在egret中使用websocket

1.连接

/** ip */
private ip:string;
/** 端口 */
private port:number;
/** 连接 */
private socket:egret.WebSocket;
/** 状态 */
private status:number;
this.socket = new egret.WebSocket();
this.socket.addEventListener( egret.ProgressEvent.SOCKET_DATA, this.onReceiveMessage, this );
this.socket.addEventListener( egret.Event.CONNECT, this.onSocketConnected, this );
this.socket.addEventListener( egret.Event.CLOSE, this.onSocketClose, this );
this.socket.addEventListener(egret.IOErrorEvent.IO_ERROR, this.onSocketError, this);
this.status = GameSocket.STATUS_CONNECTING;
this.socket.connect(this.ip, this.port);

2.连接成功事件

//连接服务器成功
private onSocketConnected() {
    this.status = GameSocket.STATUS_CONNECTED
    console.log('---连接成功');
    // 开启心跳
    egret.startTick(this.sendHeartBeat, this);
}

3.收到数据事件,这里数据格式默认使用string,也可为二进制数据

    //收到服务器数据
    private onReceiveMessage() {
        console.log('---收到服务器数据')
        var msg = this.socket.readUTF();
        console.log('---读取服务器数据', msg)
    }

3.连接关闭,可能是服务端主动关闭,也可能是客户端关闭,都会收到事件

    //连接关闭
    private onSocketClose() {
        console.log('---连接关闭');
        this.status = GameSocket.STATUS_DISCONNECT;
        // 关闭心跳
        egret.stopTick(this.sendHeartBeat, this);
        this.socket = null;
    }

4.异常处理

    private onSocketError(e) {
        console.log('连接错误', e);
    }

5.发送数据

    public send(req) {
        if(this.status != GameSocket.STATUS_CONNECTED) {
            console.log('---连接关闭');
            return;
        }
        console.log('---发送', req)
        this.socket.writeUTF(JSON.stringify(req));
    }

6.连接超时怎么处理,看了下api好像没有写,自己处理下

前面定义连接状态,连接前设置为connecting,在连接成功后设置为connected,开启定时器10秒后判断是否连接成功

1 window.setTimeout(() => {
2             if (this.status == GameSocket.STATUS_CONNECTING) {
3                 // 超时
4                 console.log("连接超时");
5                 this.close()
6             }
7         }, 10000)

 7.心跳,方便服务器判断客户端是否活动状态

连接成功后开启

egret.startTick(this.sendHeartBeat, this);

连接关闭时停止

egret.stopTick(this.sendHeartBeat, this);

心跳的数据,可以随便客户端和服务端可以自己约定内容

猜你喜欢

转载自www.cnblogs.com/woaitech/p/12263353.html