Egret社区

qq小程序wss连接报错

2020-1-3 09:16
1081
背景:
           qq小程序使用wss连接游戏c++服务器, 正常启动(即小程序所谓的冷启动或者在开发者工具中编译启动)连接正常。但是在qq小程序开发工具中和手机中断线重连,即不重新加载js代码,直接new wss,连接服务器会失败。以前公司项目采用nginx代理wss后转换为ws交给后端处理, 怀疑代理问题后,在后端用<open/ssl>库实现对ssl层的解析,问题现象依然存在。
现象:
         客户端连接代码片段:
  1. public connect(host: string, port: number, isWss:boolean = false):void
  2.         {
  3.             Context.logMgr.addLog("SocketT connect() host="+host+" port="+port+" isWss="+isWss + " m_socket="+this.m_socket);
  4.             if(this.m_socket)
  5.             {
  6.                 close();
  7.             }
  8.             this.m_socket = new egret.WebSocket();
  9.             this.m_socket.type = egret.WebSocket.TYPE_BINARY;
  10.             this.m_socket.addEventListener(egret.Event.CONNECT, this.onConnect, this);
  11.             this.m_socket.addEventListener(egret.IOErrorEvent.IO_ERROR, this.onError, this);     
  12.             if(isWss)
  13.             {               
  14.                 this.m_socket.connectByUrl("wss://"+ host + ":" + port);
  15.             }
  16.             else
  17.             {
  18.                 this.m_socket.connect(host, port);
  19.             }
  20.             
  21.         }

  22.         private onConnect(e:egret.Event)
  23.         {
  24.             Context.logMgr.addLog("wss服务器 连上了");
  25.             this.m_socket.removeEventListener(egret.Event.CONNECT, this.onConnect, this);
  26.             this.m_socket.addEventListener(egret.Event.CLOSE, this.onClose, this);
  27.             this.m_socket.addEventListener(egret.ProgressEvent.SOCKET_DATA, this.onSocketData, this);
  28.             this.dispatchEventWith(egret.Event.CONNECT);            
  29.         }
复制代码


     服务器端代码片段:
  1. 83 bool SSLHandle::doHandShake()
  2. 84 {
  3. 85     int ret = SSL_accept(_ssl);
  4. 86     if (ret == -1) {
  5. 87         ERR_print_errors_fp(stderr);
  6. 88         Zebra::logger->error("[ssl]doHandShake 失败");
  7. 89         return false;
  8. 90     } else {
  9. 91         Zebra::logger->debug("[ssl]doHandShake 返回码:%d", ret);
  10. 92     }
  11. 93     return true;
  12. 94 }
复制代码



断线重连时候, 服务器的日志显示 SSL_accept()函数返回值始终为1,说明ssl握手完成。ws协议返回字符串也打印正常。但是客户端的onConnect函数没有调用,其他和socket相关的回调函数也都没有被调用。导致断线重连过程停滞。因为egret引擎没有更详细的错误码,导致问题无法定位,谁知道有何种手段呢,


分享到 :
0 人收藏

1 个回复

倒序浏览
shaoliufei  登堂入室 | 2020-1-3 11:08:39
断线重联 我遇到过的问题,如果断线后立即重联socket 会连接不成功。
解决办法 中间加个间隔(几百毫秒) 重连就成功了。 你可以试一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

panqiangqiang

初学乍练

积分: 0 帖子: 0 精华: 0

楼主热帖

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部