webSocketBase.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /**
  2. * websocket核心模块,实现实体接口调用,消息广播,transid管理
  3. */
  4. var WebSocketBase = {};
  5. WebSocketBase.socket = new ws('ws://127.0.0.1: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(function() {
  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. {
  108. msg.sessionID = WebSocketBase.sessionSet[msg.entity];
  109. //如果是接口调用,且session没创建,则先创建会话再发送
  110. if(WebSocketBase.sessionStateSet[msg.sessionID] != WebSocketBase.SessionState.Connected)
  111. {
  112. WebSocketBase.startAndSend(msg, callback);
  113. return;
  114. }
  115. }
  116. //socket已连接,发送
  117. if(WebSocketBase.socket.readyState == WebSocket.OPEN) {
  118. logEvent("socket:sendMsg"+JSON.stringify(msg));
  119. var transId = msg.transID;
  120. WebSocketBase.socket.send(JSON.stringify(msg));
  121. if(!callback)
  122. return;
  123. if (!WebSocketBase.callbacksList[transId]) {
  124. WebSocketBase.callbacksList[transId] = [];
  125. }
  126. WebSocketBase.callbacksList[transId].push(callback);
  127. }
  128. //socket未连接,丢到队列里面
  129. else if(WebSocketBase.socket.readyState == WebSocket.CONNECTING){
  130. var data = { msg: msg, callback: callback };
  131. WebSocketBase.sendQueue.push(data);
  132. }
  133. };
  134. //发送队列待发送的消息
  135. WebSocketBase.fireQueue= function() {
  136. logEvent("fireQueue()");
  137. while (WebSocketBase.sendQueue.length && WebSocketBase.socket.readyState == WebSocket.OPEN) {
  138. var data = WebSocketBase.sendQueue.shift();
  139. WebSocketBase.sendMsg(data.msg, data.callback);
  140. }
  141. while (WebSocketBase.registerQueue.length && WebSocketBase.socket.readyState == WebSocket.OPEN) {
  142. var data = WebSocketBase.registerQueue.shift();
  143. WebSocketBase.registerEvent(data.msg, data.callback);
  144. }
  145. };
  146. //注册事件
  147. WebSocketBase.registerEvent= function(registerMsg, callback) {
  148. if(WebSocketBase.socket.readyState == WebSocket.OPEN) {
  149. logEvent("registerEvent"+JSON.stringify(registerMsg));
  150. var registerId = registerMsg.transID;
  151. WebSocketBase.socket.send(JSON.stringify(registerMsg));
  152. if (!WebSocketBase.registerEvents[registerId]) {
  153. WebSocketBase.registerEvents[registerId] = [];
  154. }
  155. WebSocketBase.registerEvents[registerId].push(callback);
  156. }
  157. //socket未连接,丢到队列里面
  158. else if(WebSocketBase.socket.readyState == WebSocket.CONNECTING){
  159. var data = { msg: registerMsg, callback: callback };
  160. WebSocketBase.registerQueue.push(data);
  161. }
  162. };
  163. //取消注册事件
  164. WebSocketBase.unregisterEvent= function(unregisterMsg) {
  165. logEvent("unregisterMsg"+JSON.stringify(registerMsg));
  166. WebSocketBase.socket.send(JSON.stringify(registerMsg));
  167. };
  168. //会话start
  169. WebSocketBase.startSession= function(msg, callback) {
  170. logEvent("startSession");
  171. msg.messageType = MessageType.beginSession;
  172. WebSocketBase.sendMsg(msg, function(data) {
  173. logEvent("startSession ret: "+JSON.stringify(data));
  174. var jsondata = JSON.parse(data);
  175. if(jsondata["errorCode"] == ErrorCodeEnum.Error_Succeed && jsondata["sessionID"]) {
  176. WebSocketBase.sessionSet[msg.entity] = jsondata["sessionID"];
  177. WebSocketBase.sessionStateSet[jsondata["sessionID"]] = WebSocketBase.SessionState.Connected;
  178. }
  179. else {
  180. logEvent("startSession failed!");
  181. }
  182. callback(jsondata);
  183. });
  184. };
  185. //创建会话并发送消息
  186. WebSocketBase.startAndSend= function(msg, callback) {
  187. logEvent("startAndSend");
  188. var sessionMsg = new Session();
  189. sessionMsg.entity = msg.entity;
  190. sessionMsg.class = msg.class;
  191. WebSocketBase.startSession(sessionMsg, function(jsondata) {
  192. if(jsondata["errorCode"] == ErrorCodeEnum.Error_Succeed) {
  193. WebSocketBase.sendMsg(msg, callback);
  194. }
  195. else {
  196. logEvent("startAndSend(), create session failed!");
  197. }
  198. });
  199. };
  200. //发送事件
  201. WebSocketBase.logSpEvent= function(eventCode, securityLevel, message) {
  202. var evtMsg = new LogEvent();
  203. evtMsg.eventCode = eventCode;
  204. evtMsg.securityLevel = securityLevel;
  205. evtMsg.message = message;
  206. logEvent("logSpEvent:"+JSON.stringify(evtMsg));
  207. WebSocketBase.socket.send(JSON.stringify(evtMsg));
  208. };
  209. //发送广播
  210. WebSocketBase.broadCast= function(broadMsg) {
  211. logEvent("broadCast:"+JSON.stringify(broadMsg));
  212. WebSocketBase.socket.send(JSON.stringify(broadMsg));
  213. };
  214. //设置系统变量
  215. WebSocketBase.setSysVar= function(name, value, callback) {
  216. var msg = new SetVarReq();
  217. msg.name = name;
  218. msg.value = value;
  219. WebSocketBase.sendMsg(msg, callback);
  220. };
  221. //获取系统变量
  222. WebSocketBase.getSysVar= function(name, callback) {
  223. var msg = new GetVarReq();
  224. msg.name = name;
  225. WebSocketBase.sendMsg(msg, callback);
  226. };