SocketEngine.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. cc.SIZE_TCP_BUFFER = 16384;
  2. cc.TCP_INFO_SIZE = 4+4;
  3. cc.TCP_COMMACN_SIZE = 4;
  4. cc.TCP_HEAD_SIZE = 8+4;
  5. cc.SIZE_PACK_INFO = 4;
  6. cc.DWORD_SIZE = 4;
  7. cc.WORD_SIZE = 2;
  8. cc.TCHAR_SIZE = 2;
  9. //网络版本
  10. cc.SOCKET_VER = 0x01;
  11. //版本信息
  12. cc.DK_VERCODE = 0xcdb2d976; //映射类型
  13. //网络命令
  14. var TCP_Info = cc.Class({
  15. ctor :function () {
  16. this.cbDataKind = 0; //数据类型
  17. this.cbCheckCode = 0; //效验字段
  18. this.wPacketSize = 0; //数据大小
  19. this.dwVerCode = 0; //版本
  20. },
  21. });
  22. //网络命令
  23. var TCP_Command = cc.Class({
  24. ctor :function () {
  25. this.wMainCmdID = 0; //主命令码
  26. this.wSubCmdID = 0; //子命令码
  27. },
  28. });
  29. //网络包头
  30. var TCP_Head = cc.Class({
  31. ctor :function () {
  32. this.TCPInfo = new TCP_Info(); //基础结构
  33. this.CommandInfo = new TCP_Command(); //命令信息
  34. },
  35. });
  36. //加密密钥
  37. var g_dwPacketKey = 0xA55AA55A;
  38. cc.CSocketEngine = cc.Class({
  39. ctor :function () {
  40. //设置回调接口
  41. this.mISocketEngineSink = arguments[0];
  42. if(window.LOG_NET_DATA)console.log('创建网络.........');
  43. this.mSocket = null;
  44. this.m_cbSendRound = 0;
  45. },
  46. isAlive:function (){
  47. if(this.mSocket==null)return false;
  48. return this.mSocket.isAlive();
  49. },
  50. /** 链接网络 **/
  51. connect :function(url, port){
  52. this.mSocket = new cc.CSocket(this);
  53. this.m_cbSendRound = 0;
  54. this.m_cbRecvRound = 0;
  55. this.m_dwSendXorKey = 0x12345678;
  56. this.m_dwRecvXorKey = 0x12345678;
  57. this.m_dwSendPacketCount = 0;
  58. // 接收长度
  59. this.mBufRecieve = new Uint8Array(cc.SIZE_TCP_BUFFER*10);
  60. this.mBufRevLength = 0;
  61. this.mSocket.connect(url, port);
  62. return this.isAlive();
  63. },
  64. /** 关闭网络 **/
  65. disconnect:function () {
  66. // 接收长度
  67. this.m_cbSendRound = 0;
  68. this.m_cbRecvRound = 0;
  69. this.m_dwSendXorKey = 0;
  70. this.m_dwRecvXorKey = 0;
  71. this.m_dwSendPacketCount = 0;
  72. if(this.mSocket!=null)this.mSocket.disconnect();
  73. this.mSocket = null;
  74. return true;
  75. },
  76. closesocket:function () {
  77. // 接收长度
  78. this.m_cbSendRound = 0;
  79. this.m_cbRecvRound = 0;
  80. this.m_dwSendXorKey = 0;
  81. this.m_dwRecvXorKey = 0;
  82. this.m_dwSendPacketCount = 0;
  83. if(this.mSocket!=null)this.mSocket.disconnect();
  84. this.mSocket = null;
  85. if(this.mISocketEngineSink!=null)this.mISocketEngineSink = null;
  86. return true;
  87. },
  88. onSocketError:function(){
  89. if(this.mISocketEngineSink && this.mSocket)this.mISocketEngineSink.OnErr();
  90. },
  91. CheckSocket:function(){
  92. if(this.mSocket==null)return false;
  93. this.mSocket.isAlive();
  94. if (!this.isAlive()){
  95. if(window.LOG_NET_DATA)console.log("數據發送失敗,網絡不可用!");
  96. this.onSocketError();
  97. this.mISocketEngineSink = null;
  98. if(this.mSocket!=null) this.mSocket.disconnect();
  99. return false;
  100. }
  101. return true;
  102. },
  103. //发送数据
  104. sendClass:function(main, sub, Obj){
  105. console.log("sendClass 发送-1 ",main,sub,Obj)
  106. if(!this.CheckSocket()){
  107. if(window.LOG_NET_DATA)console.log("sendClass scoker err "+main+" "+sub);
  108. return false;
  109. }
  110. var objSize = 0;
  111. if(Obj) objSize = gCByte.GetSize(Obj);
  112. var SendData = new Uint8Array(cc.TCP_HEAD_SIZE + objSize);
  113. //填写信息头
  114. var tcpHead = new TCP_Head();
  115. tcpHead.TCPInfo.cbDataKind = cc.SOCKET_VER;
  116. tcpHead.TCPInfo.wPacketSize = SendData.length;
  117. tcpHead.TCPInfo.dwVerCode = cc.DK_VERCODE;
  118. tcpHead.CommandInfo.wMainCmdID = main;
  119. tcpHead.CommandInfo.wSubCmdID = sub;
  120. gCByte.Str2Bytes(tcpHead, SendData);
  121. if(objSize)gCByte.Str2Bytes(Obj, SendData,cc.TCP_HEAD_SIZE);
  122. //加密数据
  123. var wSendSize = this.EncryptBufferS(SendData, SendData.length);
  124. this.mSocket.send(SendData);
  125. },
  126. //发送数据
  127. send:function (main, sub, pData, wDataSize){
  128. console.log("send 发送-2 ",main,sub)
  129. if(!this.CheckSocket()){
  130. if(window.LOG_NET_DATA)console.log(" err "+main+" "+sub)
  131. return false;
  132. }
  133. //效验大小
  134. if (wDataSize > cc.SIZE_TCP_BUFFER) return false;
  135. var tcpHead = new TCP_Head();
  136. var SendData = new Uint8Array(cc.TCP_HEAD_SIZE+wDataSize);
  137. //填写信息头
  138. tcpHead.TCPInfo.cbDataKind = cc.SOCKET_VER;
  139. tcpHead.TCPInfo.wPacketSize = SendData.length;
  140. tcpHead.TCPInfo.dwVerCode = cc.DK_VERCODE;
  141. tcpHead.CommandInfo.wMainCmdID = main;
  142. tcpHead.CommandInfo.wSubCmdID = sub;
  143. gCByte.Str2Bytes(tcpHead,SendData);
  144. for(var i = 0;i < wDataSize;i++){
  145. SendData[i+cc.TCP_HEAD_SIZE] = pData[i];
  146. }
  147. //加密数据
  148. var wSendSize = this.EncryptBufferS(SendData, SendData.length);
  149. this.mSocket.send(SendData);
  150. return true;
  151. },
  152. //加密数据
  153. EncryptBufferS:function (pcbDataBuffer,wBufferSize){
  154. //效验码与字节映射
  155. var cbCheckCode = 0;
  156. for (var i = cc.TCP_INFO_SIZE; i<wBufferSize; i++){
  157. cbCheckCode += pcbDataBuffer[i];
  158. pcbDataBuffer[i] = gQPCipher.MapSendByteS(pcbDataBuffer,i);
  159. }
  160. //填写信息头
  161. gCByte.w1( pcbDataBuffer,1,~cbCheckCode + 1);
  162. //设置变量
  163. this.m_dwSendPacketCount++;
  164. return wBufferSize;
  165. },
  166. //解密数据
  167. CrevasseBufferS :function(pcbDataBuffer,wBufferSize){
  168. //效验码与字节映射
  169. var cbCheckCode = new Uint8Array(1);
  170. cbCheckCode[0] = pcbDataBuffer[1];
  171. for (var i = cc.TCP_INFO_SIZE; i<wBufferSize; i++){
  172. var cbRecvRound = new Uint8Array(1);
  173. pcbDataBuffer[i] = gQPCipher.MapRecvByteS(pcbDataBuffer,i);
  174. cbCheckCode[0] += pcbDataBuffer[i];
  175. }
  176. if (cbCheckCode[0] != 0) if(window.LOG_NET_DATA)console.log('CheckCode Error.');
  177. },
  178. //加密数据
  179. EncryptBuffer :function(pcbDataBuffer,wDataSize,wBufferSize){
  180. //调整长度
  181. var wEncryptSize = wDataSize - cc.TCP_COMMACN_SIZE, wSnapCount = 0;
  182. if ((wEncryptSize%cc.DWORD_SIZE) != 0){
  183. wSnapCount = cc.DWORD_SIZE-wEncryptSize%cc.DWORD_SIZE;
  184. }
  185. //效验码与字节映射
  186. var cbCheckCode = 0;
  187. for (var i = cc.TCP_INFO_SIZE; i<wDataSize; i++){
  188. cbCheckCode += pcbDataBuffer[i];
  189. var cbSendRound = new Uint8Array(1);
  190. cbSendRound[0] = this.m_cbSendRound;
  191. pcbDataBuffer[i] = gQPCipher.MapSendByteS(pcbDataBuffer,i, cbSendRound);
  192. this.m_cbSendRound = cbSendRound[0];
  193. }
  194. //填写信息头
  195. //cbDataKind
  196. gCByte.w1(pcbDataBuffer,0,cc.SOCKET_VER);
  197. //cbCheckCode
  198. gCByte.w1( pcbDataBuffer,1,~cbCheckCode + 1);
  199. //wPacketSize
  200. gCByte.w2(pcbDataBuffer,2,wDataSize);
  201. //创建密钥
  202. var dwXorKey = this.m_dwSendXorKey;
  203. if (this.m_dwSendPacketCount == 0){
  204. //生成第一次随机种子
  205. dwXorKey = 99999;
  206. dwXorKey ^= 1;
  207. dwXorKey ^= 1;
  208. dwXorKey ^= 1;
  209. dwXorKey ^= 1;
  210. //随机映射种子
  211. dwXorKey = this.SeedRandMap(dwXorKey&0xFFFF);
  212. dwXorKey |= (this.SeedRandMap((dwXorKey >> 16)&0xFFFF)&0xFFFFFFFF) << 16;
  213. dwXorKey ^= g_dwPacketKey;
  214. this.m_dwSendXorKey = dwXorKey;
  215. this.m_dwRecvXorKey = dwXorKey;
  216. }
  217. //加密数据
  218. var wEncrypCount = (wEncryptSize + wSnapCount) / cc.DWORD_SIZE;
  219. var t = 0;
  220. var tt = 0;
  221. for (var i = 0; i<wEncrypCount; i++){
  222. gCByte.w4(pcbDataBuffer,cc.TCP_INFO_SIZE+tt,gCByte.r4(pcbDataBuffer,cc.TCP_INFO_SIZE+tt)&0xFFFFFFFF ^ (dwXorKey&0xFFFFFFFF));
  223. tt+=cc.DWORD_SIZE;
  224. dwXorKey = this.SeedRandMap(gCByte.r2(pcbDataBuffer,cc.TCP_INFO_SIZE+t));
  225. t+=cc.WORD_SIZE;
  226. dwXorKey |= (this.SeedRandMap(gCByte.r2(pcbDataBuffer,cc.TCP_INFO_SIZE+t))&0xFFFFFFFF) << 16;
  227. t+=cc.WORD_SIZE;
  228. dwXorKey ^= g_dwPacketKey;
  229. }
  230. //插入密钥
  231. if (this.m_dwSendPacketCount == 0) {
  232. for(var i = wDataSize+wSnapCount;i>cc.TCP_HEAD_SIZE;i--){
  233. pcbDataBuffer[i+cc.DWORD_SIZE-1] = pcbDataBuffer[i-1];
  234. }
  235. gCByte.w4(pcbDataBuffer,cc.TCP_HEAD_SIZE,this.m_dwSendXorKey);
  236. gCByte.w2(pcbDataBuffer,2,gCByte.r2(pcbDataBuffer,2)+cc.DWORD_SIZE);
  237. wDataSize += cc.DWORD_SIZE;
  238. }
  239. //设置变量
  240. this.m_dwSendPacketCount++;
  241. this.m_dwSendXorKey = dwXorKey;
  242. return wDataSize;
  243. },
  244. //解密数据
  245. CrevasseBuffer:function (pcbDataBuffer,wDataSize){
  246. //调整长度
  247. var wSnapCount = 0;
  248. if ((wDataSize%cc.DWORD_SIZE) != 0) {
  249. wSnapCount = cc.DWORD_SIZE-wDataSize%cc.DWORD_SIZE;
  250. for(var i=0;i<wSnapCount;i++){
  251. pcbDataBuffer[wDataSize+i] = 0;
  252. }
  253. }
  254. //解密数据
  255. var dwXorKey = this.m_dwRecvXorKey;
  256. var wEncrypCount = (wDataSize + wSnapCount - cc.TCP_INFO_SIZE) / 4;
  257. var t = 0;
  258. var tt = 0;
  259. for (var i = 0; i<wEncrypCount; i++){
  260. if ((i == (wEncrypCount - 1)) && (wSnapCount>0)){
  261. var pcbKey = new Uint8Array(cc.DWORD_SIZE);
  262. gCByte.w4(pcbKey,0,this.m_dwRecvXorKey);
  263. var cbKey = new Uint8Array(cc.DWORD_SIZE);
  264. var j=0;
  265. for(var ts=cc.DWORD_SIZE-wSnapCount;ts<cc.DWORD_SIZE;ts++){
  266. cbKey[j++] = pcbKey[ts];
  267. }
  268. for(var ts=0;ts<wSnapCount;ts++){
  269. pcbDataBuffer[wDataSize+ts] = cbKey[ts];
  270. }
  271. }
  272. dwXorKey = this.SeedRandMap(gCByte.r2(pcbDataBuffer,cc.TCP_INFO_SIZE+t));
  273. t+=cc.WORD_SIZE;
  274. dwXorKey |= (this.SeedRandMap(gCByte.r2(pcbDataBuffer,cc.TCP_INFO_SIZE+t))&0xFFFFFFFF) << 16;
  275. t+=cc.WORD_SIZE;
  276. dwXorKey ^= g_dwPacketKey;
  277. gCByte.w4(pcbDataBuffer,cc.TCP_INFO_SIZE+tt,gCByte.r4(pcbDataBuffer,cc.TCP_INFO_SIZE+tt)&0xFFFFFFFF ^ (this.m_dwRecvXorKey&0xFFFFFFFF));
  278. tt+=cc.DWORD_SIZE;
  279. this.m_dwRecvXorKey = dwXorKey;
  280. }
  281. //效验码与字节映射
  282. var cbCheckCode = new Uint8Array(1);
  283. cbCheckCode[0] = pcbDataBuffer[1];
  284. for (var i = cc.TCP_INFO_SIZE; i<wDataSize; i++){
  285. var cbRecvRound = new Uint8Array(1);
  286. cbRecvRound[0] = this.m_cbRecvRound;
  287. pcbDataBuffer[i] = gQPCipher.MapRecvByte(pcbDataBuffer,i, cbRecvRound);
  288. this.m_cbRecvRound = cbRecvRound[0];
  289. cbCheckCode[0] += pcbDataBuffer[i];
  290. }
  291. if (cbCheckCode[0] != 0) if(window.LOG_NET_DATA)console.log('CheckCode Error.');
  292. },
  293. //随机映射
  294. SeedRandMap:function (wSeed){
  295. var dwHold = wSeed;
  296. return ((dwHold = dwHold * 241103 + 2533101) >> 16)&0xFFFF;
  297. },
  298. onSocketLink:function (event) {
  299. if (this.mISocketEngineSink) this.mISocketEngineSink.onEventTCPSocketLink(event);
  300. },
  301. onSocketShut:function () {
  302. this.m_cbSendRound = 0;
  303. this.m_cbRecvRound = 0;
  304. this.m_dwSendXorKey = 0;
  305. this.m_dwRecvXorKey = 0;
  306. this.m_dwSendPacketCount = 0;
  307. if (this.mISocketEngineSink != null)
  308. this.mISocketEngineSink.onEventTCPSocketShut();
  309. },
  310. onSocketData:function (data){
  311. var dataArray = new Uint8Array(data);
  312. for(var i=0;i<dataArray.length;i++){
  313. this.mBufRecieve[this.mBufRevLength+i] = dataArray[i];
  314. }
  315. // 接收长度增加
  316. this.mBufRevLength += dataArray.length;
  317. // 尝试解包
  318. var iUnpackIndex = 0;
  319. var iDstLength = cc.SIZE_PACK_INFO;
  320. while (this.mBufRevLength >= cc.TCP_HEAD_SIZE && (this.mBufRevLength < 65262)) {
  321. iDstLength = gCByte.r2(this.mBufRecieve,2);
  322. if (this.mBufRevLength < iDstLength) return ;
  323. var cbDataBuffer = this.mBufRecieve.slice(0,iDstLength);
  324. this.mBufRevLength -= iDstLength;
  325. for(var i=0;i<this.mBufRevLength;i++){
  326. this.mBufRecieve[i] = this.mBufRecieve[iDstLength + i];
  327. }
  328. // 解包数据并通知调用
  329. if (!this.unpack(cbDataBuffer, iUnpackIndex, iDstLength)) {
  330. this.disconnect();
  331. return;
  332. }
  333. }
  334. },
  335. unpack:function (data,start,length){
  336. // 解密
  337. if ((data[start] & gQPCipher.getCipherMode()) > 0){
  338. var wRealySize = this.CrevasseBufferS(data, length);
  339. }
  340. //填写信息头
  341. var tcpHead = new TCP_Head();
  342. gCByte.Bytes2Str(tcpHead,data);
  343. var cbData = new Uint8Array(length-cc.TCP_HEAD_SIZE);
  344. for(var i=0;i<length-cc.TCP_HEAD_SIZE;i++){
  345. cbData[i] = data[i + cc.TCP_HEAD_SIZE];
  346. }
  347. if (tcpHead.CommandInfo.wMainCmdID == 0){
  348. if(tcpHead.CommandInfo.wSubCmdID == 1) {
  349. this.send(0, 1, data, length);
  350. }else if(tcpHead.CommandInfo.wSubCmdID == SUB_KN_CLIENT_HEART){
  351. if (this.mISocketEngineSink != null) this.mISocketEngineSink.OnSocketHeart();
  352. }
  353. }else{
  354. if (this.mISocketEngineSink != null){
  355. var bHandle = this.mISocketEngineSink.onEventTCPSocketRead(tcpHead.CommandInfo.wMainCmdID,tcpHead.CommandInfo.wSubCmdID, cbData, cbData.length);
  356. if(bHandle == null || !bHandle) if(window.LOG_NET_DATA)console.log("onEventTCPSocketRead "+tcpHead.CommandInfo.wMainCmdID+" -- "+tcpHead.CommandInfo.wSubCmdID)
  357. return bHandle;
  358. }
  359. }
  360. return true;
  361. }
  362. });