123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- import { _decorator, Component, Node } from 'cc';
- import { msgManager } from './msgManager';
- import { userDataManager } from '../manager/userDataManager';
- const { ccclass, property } = _decorator;
- @ccclass('gameSocket')
- export class gameSocket extends Component {
- private static _instance: gameSocket | null = null;
- public static get Instance() {
- if (gameSocket._instance === null)
- gameSocket._instance = new gameSocket();
- return gameSocket._instance;
- }
- sock:WebSocket = null;
- private current_url:string = '' //当前url
- is_connected:Boolean = false;
- stopConnected:Boolean = false;
- check_heartbeat_succeed:boolean = false;
- is_online_status:boolean = false; //是否是在线状态
- private reconnectInterval = 1000; // 重连间隔时间(毫秒)
- private reconnectMaxAttempts = 30; // 最大重连尝试次数
- private reconnectAttempts = 0; // 当前重连尝试次数
- private static RECV_HEART_BEAT ='1' //收到服务器心跳结果
- private static RECV_CHEAK_HEART_BEAT = '2' //服务器查询我的心跳
- _on_opened(event:Event):void {
- console.log('_on_opened=',event)
- this.reconnectAttempts = 0
- if(this.is_connected===true){
- }else{
- this.is_connected = true;
- this.check_heartbeat_succeed = true;
- gameSocket.Instance.is_online_status = true;
- if(userDataManager.user_data) {
- msgManager.relink()
- }
- }
- }
- _on_recv_data(event:any):void {
- console.log('_on_recv_data=',event)
- this.check_heartbeat_succeed = true;
- if(event.data===gameSocket.RECV_HEART_BEAT){
- // if(GameMng.reward_tong_bi){
- // UIManager.removeWaitViewLayer()
- // GameMng.reward_tong_bi = false;
- // msgManager.ad_tongbi(1)
- // }
- // if(GameMng.firendOpenId!=""){
- // UIManager.removeWaitViewLayer()
- // msgManager.add_firend(parseInt(GameMng.firendOpenId))
- // msgManager.user_join_room(parseInt(GameMng.firendOpenId))
- // GameMng.firendOpenId = ""
- // }
- //console.log("接受服务端返回的心跳",GameUtil.curTime())
- return
- }
- if(event.data===gameSocket.RECV_CHEAK_HEART_BEAT){
- gameSocket.Instance.heartbeat();
- return
- }
- if(event.data===""||event.data===null){
- console.assert(true,"接受输出格式错误,data为空",event)
- }else{
- msgManager.recv(event.data)
- }
- }
- _on_socket_close(event:any):void {
- console.log("_on_socket_close",event)
- this.reConnectOperation()
- this.is_connected = false;
- }
- _on_socket_err(event:any):void {
- console.log("_on_socket_err",event)
- this.reConnectOperation()
- this.is_connected = false;
- }
- private reConnectOperation() {
- if (this.reconnectAttempts < this.reconnectMaxAttempts) {
- console.log('正在尝试重连...');
- setTimeout(()=>{
- this.reonnect()
- },this.reconnectInterval)
- this.reconnectAttempts++;
- } else {
- console.log('重连尝试次数已达上限');
- }
- }
- reonnect() {
- if(this.current_url.length<=0) {
- return
- }
- this.connect(this.current_url)
- }
- connect(url:any):void {
- if(this.stopConnected){
- console.log("客户端退出链接,暂不提供重连")
- return
- }
- this.current_url = url
- if(!this.is_connected){
- try{
- this.sock = new WebSocket(url);
- this.sock.binaryType = "arraybuffer"; //"arraybuffer", "blob", "document", "json", and "text".
- this.sock.onopen = this._on_opened.bind(this);
- this.sock.onmessage = this._on_recv_data.bind(this);
- this.sock.onclose = this._on_socket_close.bind(this);
- this.sock.onerror = this._on_socket_err.bind(this);
- }catch(e:any){
- console.log("connect error",e)
- }
- }
- }
- heartbeat(){
- this.check_heartbeat_succeed = false;
- this.send_cmd(0);
- }
- /**
- * this.sock.readyState
- * CONNECTING:值为0,表示正在连接
- * OPEN:值为1,表示连接成功,可以通信了
- * CLOSING:值为2,表示连接正在关闭
- * CLOSED:值为3,表示连接已经关闭,或者打开连接失败
- */
- send_cmd(body):void {
- if (!this.sock || !this.is_connected) {
- return;
- }
- try{
- console.log('sock.readyState=',this.sock.readyState)
- if(this.sock.readyState===1){
- if(typeof body == 'number'){
- body=body+""
- }
- console.log('发送消息',body)
- this.sock.send(body);
- }
- }catch(e:any){
- console.log("e",e)
- }
- }
- close():void {
- if (this.sock !== null) {
- this.sock.close();
- this.sock = null;
- }
- this.is_connected = false;
- this.check_heartbeat_succeed = false;
- }
- }
|