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);
心跳的数据,可以随便客户端和服务端可以自己约定内容
个人主页:http://521100.net