webSocketBase.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /**
  2. * websocket核心模块,实现实体接口调用,消息广播,transid管理
  3. */
  4. var WebSocketBase = {};
  5. WebSocketBase.socket = new ws('ws://99.12.23.78:9002');
  6. WebSocketBase.retryTimes = 0;
  7. WebSocketBase.interval = 0;
  8. WebSocketBase.isreconnecting = false;
  9. WebSocketBase.callbacksList = {};
  10. WebSocketBase.registerEvents = {};
  11. WebSocketBase.sendQueue = [];
  12. WebSocketBase.registerQueue = [];
  13. WebSocketBase.sessionSet = {}; //会话列表,实体名为key,session为value
  14. WebSocketBase.sessionStateSet = {}; //会话状态列表,sessionID为key,SessionState为value
  15. WebSocketBase.SessionState = {
  16. Initialize: 0,
  17. Connecting: 1,
  18. Connected: 2,
  19. NotConnected: 3,
  20. Fault: 4
  21. }
  22. //正在连接
  23. WebSocketBase.socket.onconnecting = function (evn) {
  24. logEvent("socket:onconnecting:" + JSON.stringify(evn));
  25. };
  26. //已连接
  27. WebSocketBase.socket.onopen = function () {
  28. logEvent("socket:opened");
  29. clearInterval(WebSocketBase.interval);
  30. WebSocketBase.isreconnecting = false;
  31. WebSocketBase.fireQueue();
  32. };
  33. //出错
  34. WebSocketBase.socket.onerror = function () {
  35. logEvent("socket:onerror");
  36. };
  37. //已关闭
  38. WebSocketBase.socket.onclose = function () {
  39. logEvent("socket:closed");
  40. WebSocketBase.reconnect();
  41. };
  42. //收到server返回消息
  43. WebSocketBase.socket.onmessage = function (evn) {
  44. var retData = JSON.parse(evn.data);
  45. var transID = retData["transID"];
  46. var msgType = retData["messageType"];
  47. if (msgType != MessageType.broadCast && !WebSocketBase.callbacksList[transID] && !WebSocketBase.registerEvents[transID]) {
  48. //oneway没有回调
  49. logEvent("transID not found");
  50. return;
  51. }
  52. switch (msgType) {
  53. //事件类型
  54. case MessageType.event:
  55. //case MessageType.register://临时测试
  56. for (var i = 0; i < WebSocketBase.registerEvents[transID].length; i++) {
  57. WebSocketBase.registerEvents[transID][i](evn.data);
  58. }
  59. break;
  60. //接口调用返回
  61. case MessageType.requestAck:
  62. //创建会话返回
  63. case MessageType.sessionAck:
  64. for (var j = 0; j < WebSocketBase.callbacksList[transID].length; j++) {
  65. WebSocketBase.callbacksList[transID][j](evn.data);
  66. }
  67. if (WebSocketBase.callbacksList[transID]) {
  68. delete WebSocketBase.callbacksList[transID];
  69. }
  70. break;
  71. case MessageType.endSession:
  72. logEvent("SessionEnd" + JSON.stringify(retData));
  73. if (WebSocketBase.sessionStateSet[retData["sessionID"]]) {
  74. WebSocketBase.sessionStateSet[retData["sessionID"]] = WebSocketBase.SessionState.NotConnected;
  75. }
  76. break;
  77. case MessageType.broadCast:
  78. logEvent('broadCast');
  79. var data = retData["data"];
  80. InnerEventEmitter.dispatch('InnerBroadcast', data);
  81. break;
  82. default:
  83. break;
  84. }
  85. };
  86. //socket重连
  87. WebSocketBase.reconnect = function () {
  88. if (!WebSocketBase.isreconnecting) {
  89. WebSocketBase.isreconnecting = true;
  90. WebSocketBase.retryTimes = 0;
  91. WebSocketBase.interval = setInterval(() => {
  92. WebSocketBase.retryTimes = WebSocketBase.conn(WebSocketBase.retryTimes, WebSocketBase.interval, WebSocketBase.socket)
  93. }, 10000);//间隔5s重连一次
  94. }
  95. };
  96. WebSocketBase.conn = function (retryTimes, intervalID, socket) {
  97. retryTimes += 1;
  98. //重连10次仍未连接则退出
  99. logEvent("socket reconnect:" + retryTimes);
  100. socket.open();
  101. return retryTimes;
  102. };
  103. //发送消息
  104. WebSocketBase.sendMsg = function (msg, callback) {
  105. logEvent("sendMsg");
  106. if (msg.messageType != MessageType.beginSession) {
  107. msg.sessionID = WebSocketBase.sessionSet[msg.entity];
  108. //如果是接口调用,且session没创建,则先创建会话再发送
  109. if (WebSocketBase.sessionStateSet[msg.sessionID] != WebSocketBase.SessionState.Connected) {
  110. WebSocketBase.startAndSend(msg, callback);
  111. return;
  112. }
  113. }
  114. //socket已连接,发送
  115. if (WebSocketBase.socket.readyState == WebSocket.OPEN) {
  116. logEvent("socket:sendMsg" + JSON.stringify(msg));
  117. var transId = msg.transID;
  118. WebSocketBase.socket.send(JSON.stringify(msg));
  119. if (!callback)
  120. return;
  121. if (!WebSocketBase.callbacksList[transId]) {
  122. WebSocketBase.callbacksList[transId] = [];
  123. }
  124. WebSocketBase.callbacksList[transId].push(callback);
  125. }
  126. //socket未连接,丢到队列里面
  127. else if (WebSocketBase.socket.readyState == WebSocket.CONNECTING) {
  128. var data = { msg: msg, callback: callback };
  129. WebSocketBase.sendQueue.push(data);
  130. }
  131. };
  132. //发送队列待发送的消息
  133. WebSocketBase.fireQueue = function () {
  134. logEvent("fireQueue()");
  135. while (WebSocketBase.sendQueue.length && WebSocketBase.socket.readyState == WebSocket.OPEN) {
  136. var data = WebSocketBase.sendQueue.shift();
  137. WebSocketBase.sendMsg(data.msg, data.callback);
  138. }
  139. while (WebSocketBase.registerQueue.length && WebSocketBase.socket.readyState == WebSocket.OPEN) {
  140. var data = WebSocketBase.registerQueue.shift();
  141. WebSocketBase.registerEvent(data.msg, data.callback);
  142. }
  143. };
  144. //注册事件
  145. WebSocketBase.registerEvent = function (registerMsg, callback) {
  146. if (WebSocketBase.socket.readyState == WebSocket.OPEN) {
  147. logEvent("registerEvent" + JSON.stringify(registerMsg));
  148. var registerId = registerMsg.transID;
  149. WebSocketBase.socket.send(JSON.stringify(registerMsg));
  150. if (!WebSocketBase.registerEvents[registerId]) {
  151. WebSocketBase.registerEvents[registerId] = [];
  152. }
  153. WebSocketBase.registerEvents[registerId].push(callback);
  154. }
  155. //socket未连接,丢到队列里面
  156. else if (WebSocketBase.socket.readyState == WebSocket.CONNECTING) {
  157. var data = { msg: registerMsg, callback: callback };
  158. WebSocketBase.registerQueue.push(data);
  159. }
  160. };
  161. //取消注册事件
  162. WebSocketBase.unregisterEvent = function (unregisterMsg) {
  163. logEvent("unregisterMsg" + JSON.stringify(registerMsg));
  164. WebSocketBase.socket.send(JSON.stringify(registerMsg));
  165. };
  166. //会话start
  167. WebSocketBase.startSession = function (msg, callback) {
  168. logEvent("startSession");
  169. msg.messageType = MessageType.beginSession;
  170. WebSocketBase.sendMsg(msg, (data) => {
  171. logEvent("startSession ret: " + JSON.stringify(data));
  172. var jsondata = JSON.parse(data);
  173. if (jsondata["errorCode"] == ErrorCodeEnum.Error_Succeed && jsondata["sessionID"]) {
  174. WebSocketBase.sessionSet[msg.entity] = jsondata["sessionID"];
  175. WebSocketBase.sessionStateSet[jsondata["sessionID"]] = WebSocketBase.SessionState.Connected;
  176. }
  177. else {
  178. logEvent("startSession failed!");
  179. }
  180. callback(jsondata);
  181. });
  182. };
  183. //创建会话并发送消息
  184. WebSocketBase.startAndSend = function (msg, callback) {
  185. logEvent("startAndSend");
  186. var sessionMsg = new Session();
  187. sessionMsg.entity = msg.entity;
  188. sessionMsg.class = msg.class;
  189. WebSocketBase.startSession(sessionMsg, (jsondata) => {
  190. if (jsondata["errorCode"] == ErrorCodeEnum.Error_Succeed) {
  191. WebSocketBase.sendMsg(msg, callback);
  192. }
  193. else {
  194. logEvent("startAndSend(), create session failed!");
  195. }
  196. });
  197. };
  198. //发送事件
  199. WebSocketBase.logSpEvent = function (eventCode, securityLevel, message) {
  200. var evtMsg = new LogEvent();
  201. evtMsg.eventCode = eventCode;
  202. evtMsg.securityLevel = securityLevel;
  203. evtMsg.message = message;
  204. logEvent("logSpEvent:" + JSON.stringify(evtMsg));
  205. WebSocketBase.socket.send(JSON.stringify(evtMsg));
  206. };
  207. //发送广播
  208. WebSocketBase.broadCast = function (broadMsg) {
  209. logEvent("broadCast:" + JSON.stringify(broadMsg));
  210. WebSocketBase.socket.send(JSON.stringify(broadMsg));
  211. };
  212. //设置系统变量
  213. WebSocketBase.setSysVar = function (name, value, callback) {
  214. var msg = new SetVarReq();
  215. msg.name = name;
  216. msg.value = value;
  217. WebSocketBase.sendMsg(msg, callback);
  218. };
  219. //获取系统变量
  220. WebSocketBase.getSysVar = function (name, callback) {
  221. var msg = new GetVarReq();
  222. msg.name = name;
  223. WebSocketBase.sendMsg(msg, callback);
  224. };