SocketEngine.js 14 KB

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