李勇

1.增加MCU动态切换,如果MCU连接出错,自动重连5次没连接成功,会进行MCU选点,切换MCU再连接

此 diff 太大无法显示。
@@ -27,7 +27,7 @@ import Server from "config/Server"; @@ -27,7 +27,7 @@ import Server from "config/Server";
27 import UTF8 from 'utf-8'; 27 import UTF8 from 'utf-8';
28 28
29 let loger = Loger.getLoger('McuClient'); 29 let loger = Loger.getLoger('McuClient');
30 -let _sdkInfo = {"version": "v1.9.11.20170419", "author": "www.3mang.com"}; 30 +let _sdkInfo = {"version": "v1.9.12.20170419", "author": "www.3mang.com"};
31 31
32 //APE 32 //APE
33 let _sass; 33 let _sass;
@@ -78,6 +78,7 @@ export default class MessageEntrance extends Emiter { @@ -78,6 +78,7 @@ export default class MessageEntrance extends Emiter {
78 _mcu = Mcu; 78 _mcu = Mcu;
79 _mcu.on('*', (type, data) => this._emit(type, data)); 79 _mcu.on('*', (type, data) => this._emit(type, data));
80 _mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuJoinMCUClassSuccessHandler.bind(this));//加入MCU课堂完成 80 _mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuJoinMCUClassSuccessHandler.bind(this));//加入MCU课堂完成
  81 + _mcu.on(MessageTypes.CHANGE_MCU_IP, this._changeMcuIpHandler.bind(this));//切换MCU,重新选点
81 82
82 //录制回放 83 //录制回放
83 _recordPlayback = RecordPlayBackParse; 84 _recordPlayback = RecordPlayBackParse;
@@ -198,8 +199,8 @@ export default class MessageEntrance extends Emiter { @@ -198,8 +199,8 @@ export default class MessageEntrance extends Emiter {
198 _mcuErrorHandler(_data, _option) { 199 _mcuErrorHandler(_data, _option) {
199 let option = _option || ""; 200 let option = _option || "";
200 let errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data] + " " + option}; 201 let errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data] + " " + option};
201 - loger.error("MCU_ERROR", errorMessage);  
202 this._emit(MessageTypes.ERROR_EVENT, errorMessage); 202 this._emit(MessageTypes.ERROR_EVENT, errorMessage);
  203 + loger.error("MCU_ERROR", errorMessage);
203 } 204 }
204 205
205 //获取当前的状态 206 //获取当前的状态
@@ -734,6 +735,31 @@ export default class MessageEntrance extends Emiter { @@ -734,6 +735,31 @@ export default class MessageEntrance extends Emiter {
734 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); 735 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
735 } 736 }
736 737
  738 + //切换MCU
  739 + _changeMcuIpHandler(){
  740 + if(GlobalConfig.isRecordPlayBack){
  741 + //录制回放不做操作
  742 + return;
  743 + }
  744 + loger.log('MCU->动态选点');
  745 + let _this=this;
  746 + this._getFastestMcuServer(function (_data) {
  747 + loger.log("MCU选点结束->", _data);
  748 + if (_data && _data.ip) {
  749 + GlobalConfig.MCUServerIP = _data.ip;
  750 + GlobalConfig.MCUServerPort = _data.port;
  751 + }else {
  752 + //随机选择一个
  753 + if (GlobalConfig.mcuList &&GlobalConfig.mcuList.length > 0) {
  754 + let index = parseInt(Math.random() * GlobalConfig.mcuList.length);
  755 + GlobalConfig.DOCServerIP = GlobalConfig.mcuList[index].ip || "";
  756 + GlobalConfig.DOCServerPort = GlobalConfig.mcuList[index].port || "";
  757 + }
  758 + }
  759 + loger.log('MCU->切换->', GlobalConfig.DOCServerIP, GlobalConfig.DOCServerPort );
  760 + });
  761 + }
  762 +
737 //Sass删除文档数据 763 //Sass删除文档数据
738 _sassDeleteDocument(_param) { 764 _sassDeleteDocument(_param) {
739 if (!_mcu.connected) { 765 if (!_mcu.connected) {
@@ -15,153 +15,164 @@ @@ -15,153 +15,164 @@
15 import Emiter from 'Emiter'; 15 import Emiter from 'Emiter';
16 import Loger from 'Loger'; 16 import Loger from 'Loger';
17 let loger = Loger.getLoger('EverSocket'); 17 let loger = Loger.getLoger('EverSocket');
18 - 18 +const MCU_MAX_RECONNECTION = 5;//最多重连次数
19 class EverSocket extends Emiter { 19 class EverSocket extends Emiter {
20 - constructor() {  
21 - super();  
22 - this._connected = false;  
23 - this._lastActiveTime = 0;//最后一次收到消息的时间  
24 - this._enableEverSocket = false;  
25 - }  
26 -  
27 - begin(ip, port) {  
28 - loger.log('开始WebSocket应用.');  
29 - this._enableEverSocket = true;  
30 - this.wsURL = 'ws://' + ip + ':' + port;  
31 - this._newConnection();  
32 - }  
33 -  
34 - end() {  
35 - loger.log('停止WebSocket应用.');  
36 - this._clear();  
37 - }  
38 -  
39 - get connected() {  
40 - return this._connected;  
41 - }  
42 -  
43 - send(data) {  
44 - if (this._connected) {  
45 - if(data){  
46 - loger.log('SEND MESSAGE,byteLength---->',data.byteLength);  
47 - }else {  
48 - loger.log('SEND MESSAGE---->');  
49 - }  
50 - this.websocket.send(data);  
51 - } else {  
52 - loger.warn('WebSocket未建立连接.消息忽略'); 20 + constructor() {
  21 + super();
  22 + this._connected = false;
  23 + this._lastActiveTime = 0;//最后一次收到消息的时间
  24 + this._enableEverSocket = false;
  25 + this.reConnectionCounter = 0;//重连次数
  26 +
  27 + }
  28 +
  29 + begin(ip, port) {
  30 + loger.log('开始WebSocket应用.');
  31 + this._enableEverSocket = true;
  32 + this.wsURL = 'ws://' + ip + ':' + port;
  33 + this._newConnection();
  34 + }
  35 +
  36 + end() {
  37 + loger.log('停止WebSocket应用.');
  38 + this._clear();
53 } 39 }
54 - }  
55 -  
56 - _setConnected(isConn = true) {  
57 - this._connected = isConn;  
58 - if (this._connected) {  
59 - this._emit(EverSocket.OPEN);  
60 - } else {  
61 - this._emit(EverSocket.CLOSED); 40 +
  41 + get connected() {
  42 + return this._connected;
  43 + }
  44 +
  45 + send(data) {
  46 + if (this._connected) {
  47 + if (data) {
  48 + loger.log('SEND MESSAGE,byteLength---->', data.byteLength);
  49 + } else {
  50 + loger.log('SEND MESSAGE---->');
  51 + }
  52 + this.websocket.send(data);
  53 + } else {
  54 + loger.warn('WebSocket未建立连接.消息忽略');
  55 + }
  56 + }
  57 +
  58 + _setConnected(isConn = true) {
  59 + this._connected = isConn;
  60 + if (this._connected) {
  61 + this._emit(EverSocket.OPEN);
  62 + } else {
  63 + this._emit(EverSocket.CLOSED);
  64 + }
62 } 65 }
63 - }  
64 -  
65 - _newConnection() {  
66 - this.websocket = new WebSocket(this.wsURL);  
67 - this.websocket.binaryType = 'arraybuffer';  
68 - this.websocket.onopen = this._onOpen.bind(this);  
69 - this.websocket.onclose = this._onClose.bind(this);  
70 - this.websocket.onerror = this._onError.bind(this);  
71 - this.websocket.onmessage = this._onMessage.bind(this);  
72 - }  
73 -  
74 - _reConnection() {  
75 - this._clear();  
76 - this.reConnectionTimeout = window.setTimeout(() => {  
77 - loger.log('WebSocket重新建立.');  
78 - window.clearTimeout(this.reConnectionTimeout);  
79 - this._newConnection();  
80 - }, EverSocket.RECONN_INTERVAL);  
81 - }  
82 -  
83 - _clear() {  
84 - //this._emit(EverSocket.CLOSED);  
85 - loger.log('WebSocket,Timers销毁');  
86 - window.clearInterval(this.pingTimer);  
87 - window.clearInterval(this.pongTimer);  
88 - window.clearInterval(this.reConnectionTimeout);  
89 - this._setConnected(false);//先设置状态  
90 - this._enableEverSocket = false;  
91 - if(this.websocket==null){  
92 - loger.log('WebSocket,Timers已经销毁');  
93 - return; 66 +
  67 + _newConnection() {
  68 + this.websocket = new WebSocket(this.wsURL);
  69 + this.websocket.binaryType = 'arraybuffer';
  70 + this.websocket.onopen = this._onOpen.bind(this);
  71 + this.websocket.onclose = this._onClose.bind(this);
  72 + this.websocket.onerror = this._onError.bind(this);
  73 + this.websocket.onmessage = this._onMessage.bind(this);
94 } 74 }
95 - this.websocket.onopen = undefined;  
96 - this.websocket.onclose = undefined;  
97 - this.websocket.onerror = undefined;  
98 - this.websocket.onmessage = undefined;  
99 - try {  
100 - this.websocket.close();  
101 - } catch (e) {  
102 - loger.log('ignore errors'); 75 +
  76 + _reConnection() {
  77 + this._clear();
  78 + window.clearTimeout(this.reConnectionTimeout);
  79 + this.reConnectionCounter++;
  80 + if (this.reConnectionCounter > MCU_MAX_RECONNECTION) {
  81 + loger.warn('已经达到最大重连次数!');
  82 + this._emit(EverSocket.ERROR, EverSocket.ERR_SOCKET_RECONNECT_FAILED);
  83 + this.reConnectionCounter=0;
  84 + }
  85 +
  86 + this.reConnectionTimeout = window.setTimeout(() => {
  87 + loger.log('WebSocket重新建立.');
  88 + window.clearTimeout(this.reConnectionTimeout);
  89 + this._newConnection();
  90 + }, EverSocket.RECONN_INTERVAL);
103 } 91 }
104 - this.websocket = undefined;  
105 92
106 - } 93 + _clear() {
  94 + //this._emit(EverSocket.CLOSED);
  95 + loger.log('WebSocket,Timers销毁');
  96 + window.clearInterval(this.pingTimer);
  97 + window.clearInterval(this.pongTimer);
  98 + window.clearInterval(this.reConnectionTimeout);
  99 + this._setConnected(false);//先设置状态
  100 + this._enableEverSocket = false;
  101 + if (this.websocket == null) {
  102 + loger.log('WebSocket,Timers已经销毁');
  103 + return;
  104 + }
  105 + this.websocket.onopen = undefined;
  106 + this.websocket.onclose = undefined;
  107 + this.websocket.onerror = undefined;
  108 + this.websocket.onmessage = undefined;
  109 + try {
  110 + this.websocket.close();
  111 + } catch (e) {
  112 + loger.log('ignore errors');
  113 + }
  114 + this.websocket = undefined;
107 115
108 - _onOpen() {  
109 - loger.log('WebSocket建立成功', this.wsURL); 116 + }
110 117
111 - //启动心跳,检查socket链接状态  
112 - this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL);  
113 - this.pongTimer = window.setInterval(this._checkPongHandler.bind(this), EverSocket.PONG_INTERVAL); 118 + _onOpen() {
  119 + loger.log('WebSocket建立成功', this.wsURL);
  120 + this.reConnectionCounter = 0;
114 121
115 - this._setConnected();  
116 - } 122 + //启动心跳,检查socket链接状态
  123 + this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL);
  124 + this.pongTimer = window.setInterval(this._checkPongHandler.bind(this), EverSocket.PONG_INTERVAL);
117 125
118 - _onClose(closeEvent) {  
119 - loger.log(`WebSocket连接断开 CODE:${closeEvent.code} REASON:${closeEvent.reason} CLEAN: ${closeEvent.wasClean}`, this.wsURL);  
120 - this._reConnection();  
121 - } 126 + this._setConnected();
  127 + }
122 128
123 - _onError() {  
124 - loger.log('WebSocket错误出现');  
125 - this._connected = false;  
126 - this._reConnection();  
127 - } 129 + _onClose(closeEvent) {
  130 + loger.log(`WebSocket连接断开 CODE:${closeEvent.code} REASON:${closeEvent.reason} CLEAN: ${closeEvent.wasClean}`, this.wsURL);
  131 + this._reConnection();
  132 + }
128 133
129 - _onMessage(messageEvent) {  
130 - loger.log('<----RECEIVE MESSAGE');  
131 - this._lastActiveTime = Date.now();  
132 - const bufferData = messageEvent.data;  
133 - if (bufferData.byteLength > 0) {  
134 - this._emit(EverSocket.MESSAGE, bufferData); 134 + _onError() {
  135 + loger.log('WebSocket错误出现');
  136 + this._connected = false;
  137 + this._reConnection();
135 } 138 }
136 - }  
137 139
138 - _sendPingHandler() {  
139 - if (this._connected) {  
140 - this.websocket.send(new ArrayBuffer);  
141 - } else {  
142 - this._reConnection(); 140 + _onMessage(messageEvent) {
  141 + loger.log('<----RECEIVE MESSAGE');
  142 + this._lastActiveTime = Date.now();
  143 + const bufferData = messageEvent.data;
  144 + if (bufferData.byteLength > 0) {
  145 + this._emit(EverSocket.MESSAGE, bufferData);
  146 + }
143 } 147 }
144 - }  
145 -  
146 - _checkPongHandler() {  
147 - let pongTime = Date.now();  
148 - if (this._lastActiveTime &&  
149 - this._lastActiveTime >= pongTime - EverSocket.PONG_INTERVAL &&  
150 - this._lastActiveTime <= pongTime  
151 - ) {  
152 -  
153 - } else {  
154 - loger.warn('---服务器PINGPONG超时-----');  
155 - this._reConnection(); 148 +
  149 + _sendPingHandler() {
  150 + if (this._connected) {
  151 + this.websocket.send(new ArrayBuffer);
  152 + } else {
  153 + this._reConnection();
  154 + }
  155 + }
  156 +
  157 + _checkPongHandler() {
  158 + let pongTime = Date.now();
  159 + if (this._lastActiveTime &&
  160 + this._lastActiveTime >= pongTime - EverSocket.PONG_INTERVAL &&
  161 + this._lastActiveTime <= pongTime
  162 + ) {
  163 +
  164 + } else {
  165 + loger.warn('---服务器PINGPONG超时-----');
  166 + this._reConnection();
  167 + }
156 } 168 }
157 - }  
158 } 169 }
159 170
160 171
161 /*//修改之前的 172 /*//修改之前的
162 -EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 5000;  
163 -EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 3000;  
164 -EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 2000;*/ 173 + EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 5000;
  174 + EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 3000;
  175 + EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 2000;*/
165 176
166 177
167 //20170223-mcu服务端修改了心跳的逻辑,如果客户端30秒没有请求,就会按离开的处理 178 //20170223-mcu服务端修改了心跳的逻辑,如果客户端30秒没有请求,就会按离开的处理
@@ -170,11 +181,14 @@ EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 21000;// @@ -170,11 +181,14 @@ EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 21000;//
170 EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 10000;//心跳间隔 181 EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 10000;//心跳间隔
171 EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 3000;//重连的间隔 182 EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 3000;//重连的间隔
172 183
  184 +
  185 +EverSocket.prototype.ERR_SOCKET_RECONNECT_FAILED =EverSocket.ERR_SOCKET_RECONNECT_FAILED=20001;//MCU自动重连失败,已经达到最大重连次数
  186 +
173 EverSocket.prototype.CONNECTING = EverSocket.CONNECTING = 0; 187 EverSocket.prototype.CONNECTING = EverSocket.CONNECTING = 0;
174 EverSocket.prototype.OPEN = EverSocket.OPEN = 1; 188 EverSocket.prototype.OPEN = EverSocket.OPEN = 1;
175 EverSocket.prototype.CLOSING = EverSocket.CLOSING = 2; 189 EverSocket.prototype.CLOSING = EverSocket.CLOSING = 2;
176 EverSocket.prototype.CLOSED = EverSocket.CLOSED = 3; 190 EverSocket.prototype.CLOSED = EverSocket.CLOSED = 3;
177 EverSocket.prototype.MESSAGE = EverSocket.MESSAGE = 4; 191 EverSocket.prototype.MESSAGE = EverSocket.MESSAGE = 4;
178 - 192 +EverSocket.prototype.ERROR = EverSocket.ERROR = 5;
179 export default new EverSocket(); 193 export default new EverSocket();
180 194
@@ -42,8 +42,6 @@ MessageTypes.VIDEO_BROADCAST= "video_broadcast";//'视频控制广播消息; @@ -42,8 +42,6 @@ MessageTypes.VIDEO_BROADCAST= "video_broadcast";//'视频控制广播消息;
42 MessageTypes.VIDEO_GET_PUBLISH_PATH= "video_get_publish_path";//获取视频推流地址 42 MessageTypes.VIDEO_GET_PUBLISH_PATH= "video_get_publish_path";//获取视频推流地址
43 MessageTypes.VIDEO_PUBLISH_RESULT= "video_publish_result";//获取视频推流结果 43 MessageTypes.VIDEO_PUBLISH_RESULT= "video_publish_result";//获取视频推流结果
44 44
45 -  
46 -  
47 //音频模块事件定义 45 //音频模块事件定义
48 MessageTypes.AUDIO_PLAY ="audio_play";// 'audio.play';//播放 46 MessageTypes.AUDIO_PLAY ="audio_play";// 'audio.play';//播放
49 MessageTypes.AUDIO_STOP = "audio_stop";//'audio.stop';//停止 47 MessageTypes.AUDIO_STOP = "audio_stop";//'audio.stop';//停止
@@ -52,6 +50,9 @@ MessageTypes.AUDIO_BROADCAST= "audio_broadcast";//'audio.broadcast'; @@ -52,6 +50,9 @@ MessageTypes.AUDIO_BROADCAST= "audio_broadcast";//'audio.broadcast';
52 MessageTypes.AUDIO_GET_PUBLISH_PATH= "audio_get_publish_path";//获取音频推流地址 50 MessageTypes.AUDIO_GET_PUBLISH_PATH= "audio_get_publish_path";//获取音频推流地址
53 MessageTypes.AUDIO_PUBLISH_RESULT= "audio_publish_result";//获取音频推流结果 51 MessageTypes.AUDIO_PUBLISH_RESULT= "audio_publish_result";//获取音频推流结果
54 52
  53 +MessageTypes.CHANGE_MS_IP ="change_ms_ip";//切换ms 重新选点
  54 +
  55 +
55 //文档模块事件定义 56 //文档模块事件定义
56 MessageTypes.DOC_DELETE="document_delete";//'document.delete';//删除文档 57 MessageTypes.DOC_DELETE="document_delete";//'document.delete';//删除文档
57 MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更) 58 MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更)
@@ -71,6 +72,10 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'wh @@ -71,6 +72,10 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'wh
71 //MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear'; 72 //MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear';
72 73
73 74
  75 +//MCU
  76 +MessageTypes.CHANGE_MCU_IP ="change_mcu_ip";//切换mcu 重新选点
  77 +
  78 +
74 //录制回放 79 //录制回放
75 MessageTypes.RECORD_PLAYBACK_UPDATE ="record_playback_update";//录制回放更新信息 80 MessageTypes.RECORD_PLAYBACK_UPDATE ="record_playback_update";//录制回放更新信息
76 81
@@ -127,6 +132,7 @@ MessageTypes.ERR_NETWORK=10000;//网络错误 @@ -127,6 +132,7 @@ MessageTypes.ERR_NETWORK=10000;//网络错误
127 MessageTypes.ERR_UNKNOWN=10001;//未知错误 132 MessageTypes.ERR_UNKNOWN=10001;//未知错误
128 133
129 MessageTypes.ERR_SOCKET_DISCONNECT=20000;//MCU断开连接,已经离开课堂 134 MessageTypes.ERR_SOCKET_DISCONNECT=20000;//MCU断开连接,已经离开课堂
  135 +MessageTypes.ERR_SOCKET_RECONNECT_FAILED=20001;//MCU自动重连失败,已经达到最大重连次数
130 136
131 //---------------错误消息 Error Reson 定义------------------------------------------------- 137 //---------------错误消息 Error Reson 定义-------------------------------------------------
132 MessageTypes.ErrorReson={}; 138 MessageTypes.ErrorReson={};
@@ -178,8 +184,7 @@ MessageTypes.ErrorReson[MessageTypes.ERR_NETWORK]="网络错误"; @@ -178,8 +184,7 @@ MessageTypes.ErrorReson[MessageTypes.ERR_NETWORK]="网络错误";
178 MessageTypes.ErrorReson[MessageTypes.ERR_UNKNOWN]="未知错误"; 184 MessageTypes.ErrorReson[MessageTypes.ERR_UNKNOWN]="未知错误";
179 185
180 MessageTypes.ErrorReson[MessageTypes.ERR_SOCKET_DISCONNECT]="MCU断开连接,已经离开课堂"; 186 MessageTypes.ErrorReson[MessageTypes.ERR_SOCKET_DISCONNECT]="MCU断开连接,已经离开课堂";
181 -  
182 - 187 +MessageTypes.ErrorReson[MessageTypes.ERR_SOCKET_RECONNECT_FAILED]="MCU自动重连失败,已经达到最大重连次数";
183 188
184 export default MessageTypes; 189 export default MessageTypes;
185 190
@@ -24,6 +24,7 @@ class MCU extends Emiter { @@ -24,6 +24,7 @@ class MCU extends Emiter {
24 this._everSocket.on(everSocket.OPEN, this._everSocketOpenHandler.bind(this)); 24 this._everSocket.on(everSocket.OPEN, this._everSocketOpenHandler.bind(this));
25 this._everSocket.on(everSocket.MESSAGE, this._everSocketMsgReceivedHandler.bind(this)); 25 this._everSocket.on(everSocket.MESSAGE, this._everSocketMsgReceivedHandler.bind(this));
26 this._everSocket.on(everSocket.CLOSED, this._everSocketCloseHandler.bind(this)); 26 this._everSocket.on(everSocket.CLOSED, this._everSocketCloseHandler.bind(this));
  27 + this._everSocket.on(everSocket.ERROR,this._everSocketErrorHandler.bind(this));
27 } 28 }
28 29
29 // 注册Ape 30 // 注册Ape
@@ -41,7 +42,14 @@ class MCU extends Emiter { @@ -41,7 +42,14 @@ class MCU extends Emiter {
41 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3); 42 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
42 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT); 43 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT);
43 } 44 }
44 - 45 + //EverSocket错误异常
  46 + _everSocketErrorHandler(_errorCode){
  47 + this._emit(MessageTypes.MCU_ERROR,_errorCode);
  48 + //如果自动重连次数已经达到最大值,重新选点
  49 + if(_errorCode==everSocket.ERR_SOCKET_RECONNECT_FAILED){
  50 + this._emit(MessageTypes.CHANGE_MCU_IP);
  51 + }
  52 + }
45 53
46 //MCU-发送加入课堂请求 54 //MCU-发送加入课堂请求
47 _sendJoinClassRequest() { 55 _sendJoinClassRequest() {