lith 4 년 전
부모
커밋
896c9e8c6b

+ 2 - 1
dotnet/Vit/Vit.Core/Vit.Core/Util/Pipelines/PipeFrame.cs

@@ -55,7 +55,8 @@ namespace Vit.Core.Util.Pipelines
                 var cur = queueBuff.Peek();
                 if (QueueBuff_dataLenOfRemoved != 0)
                 {
-                    cur = new ArraySegment<byte>(cur.Array, cur.Offset + QueueBuff_dataLenOfRemoved, cur.Count - QueueBuff_dataLenOfRemoved);
+                    //cur = new ArraySegment<byte>(cur.Array, cur.Offset + QueueBuff_dataLenOfRemoved, cur.Count - QueueBuff_dataLenOfRemoved);
+                    cur = cur.Slice(QueueBuff_dataLenOfRemoved);
                 }
 
                 if (cur.Count <= leftCount)

+ 12 - 9
dotnet/netcore/ServiceCenter/App.Gover.Gateway/wwwroot/JsStation/JsStation.html

@@ -9,16 +9,10 @@
     <script>
 
 
-        var serviceStation = new sers.ServiceStation();
-
+        //var clConfig = { host: 'ws://0.0.0.0:4503', secretKey: 'SersCL' };
+        var clConfig = { host: 'ws://' + location.hostname + ':4503', secretKey: 'SersCL' };
 
-        //设置websocket host 地址 demo: "ws://127.0.0.1:4503"
-        //serviceStation.org.setHost("ws://127.0.0.1:4503");
-        serviceStation.org.setHost('ws://' + location.hostname+':4503');
-        
-
-        //连接秘钥,用以验证连接安全性。服务端和客户端必须一致
-        serviceStation.org.secretKey = "SersCL";
+        var serviceStation = new sers.ServiceStation();
 
 
         /*
@@ -72,6 +66,15 @@
 
         function startService() {
             try {
+
+                //设置websocket host 地址 demo: "ws://127.0.0.1:4503"
+                //serviceStation.org.setHost("ws://127.0.0.1:4503");
+                serviceStation.org.setHost(clConfig.host);
+
+
+                //连接秘钥,用以验证连接安全性。服务端和客户端必须一致
+                serviceStation.org.secretKey = clConfig.secretKey;
+
                 serviceStation.start();
             } catch (e) {
                 vit.logger.error(e);

+ 145 - 148
dotnet/netcore/ServiceCenter/App.Gover.Gateway/wwwroot/JsStation/sers.ServiceStation.js

@@ -1,12 +1,12 @@
 /*
  * sers.ServiceStation.js 扩展  
- * Date   : 2019-12-27
- * Version: 1.0
+ * Date   : 2020-07-12
+ * Version: 1.1
  * author : Lith
  * email  : sersms@163.com
  */
 
-;var sers = { version:'1.0'};
+; var sers = { version: '1.0' };
 
 /*
  * vit.js 扩展  
@@ -20,7 +20,8 @@
     // vit工具函数
     ; (function () {
 
-        vit.stringToBytes=function (str) {
+        vit.stringToBytes = function (str) {
+            if (!str) return [];
             var bytes = new Array();
             var len, c;
             len = str.length;
@@ -43,12 +44,11 @@
                 }
             }
             return bytes;
+        };
 
 
-        }
-
-
-        vit.bytesToString=function (bytes) {
+        vit.bytesToString = function (bytes) {
+            if (!bytes) return null;
             if (typeof bytes === 'string') {
                 return bytes;
             }
@@ -70,11 +70,11 @@
                 }
             }
             return str;
-        }
+        };
 
         vit.bytesToObject = function (bytes) {
             return eval('(' + vit.bytesToString(bytes) + ')');
-        };       
+        };
 
 
         vit.objectSerializeToString = function (obj) {
@@ -89,17 +89,21 @@
         };
 
 
-        vit.objectSerializeToBytes = function (obj) {            
-            var str = vit.objectSerializeToString(obj);            
+        vit.objectSerializeToBytes = function (obj) {
+            var str = vit.objectSerializeToString(obj);
             return vit.stringToBytes(str);
         };
 
 
         //合并连个数组
-        vit.arrayConcat = function (a, b) {
-            a.push.apply(a, b);
+        vit.arrayConcat = function (a, b, count) {
+            //a.push.apply(a, b);
+            if (!count) count = b.length;
+            for (var t = 0; t < count; t++) {
+                a.push(b[t]);
+            }
             return a;
-        }
+        };
 
         vit.bytesToArrayBuffer = function (bytes) {
             return new Uint8Array(bytes).buffer;
@@ -144,24 +148,24 @@
             function S4() {
                 return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
             }
-            return (S4() + S4() +  S4() + S4() +     S4() + S4() + S4() + S4());
-        }  
+            return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4());
+        };
 
     })();
 
- 
+
     //vit.logger
     (function (logger) {
-         
-            /*** 对Date的扩展,将 Date 转化为指定格式的String * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q)
-            *     可以用 1-2 个占位符 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
-            * eg: 
-            * (newDate()).pattern("yyyy-MM-dd hh:mm:ss.S")==> 2006-07-02 08:09:04.423      
-            * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04      
-            * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04      
-            * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04      
-            * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18      
-            */
+
+        /*** 对Date的扩展,将 Date 转化为指定格式的String * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q)
+        *     可以用 1-2 个占位符 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
+        * eg: 
+        * (newDate()).pattern("yyyy-MM-dd hh:mm:ss.S")==> 2006-07-02 08:09:04.423      
+        * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04      
+        * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04      
+        * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04      
+        * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18      
+        */
         Date.prototype.pattern = function (fmt) {
             var o = {
                 "M+": this.getMonth() + 1, //月份         
@@ -194,9 +198,7 @@
                 }
             }
             return fmt;
-        }; 
-                   
-
+        };
 
         //function(message){}
         logger.onmessage;
@@ -225,12 +227,10 @@
 })('undefined' === typeof (vit) ? vit = {} : vit);
 
 
-
-
 /*
 * sers.CL.js 扩展
-* Date   : 2019-12-27
-* Version: 1.0
+* Date   : 2020-07-12
+* Version: 1.1
 * author : Lith
 * email  : sersms@163.com
 */
@@ -240,32 +240,80 @@
 
     function PipeFrame() {
 
-        this.write = function (bytes) {
-            vit.arrayConcat(receive, bytes);
+        this.write = function (arrayBuffer) {
+            queueBuff.push(new Uint8Array(arrayBuffer));
+            buffLen += arrayBuffer.byteLength;
         };
 
 
-        //bytes
-        var receive = [];
+        //DataView list
+        var queueBuff = [];
+        var buffLen = 0;
+
+
+        var QueueBuff_dataLenOfRemoved = 0;
 
         //return bytes
-        this.read = function () {
-            if (receive.length < 4) {
+        function read(lenToPop) {
+            if (buffLen < lenToPop) {
                 return;
             }
 
-            var length = vit.bytesGetInt32(receive, 0);
-            if (receive.length < length + 4) {
-                return;
+            buffLen -= lenToPop;
+
+
+            var dataToPop = [];
+            var copyedIndex = 0;
+            while (copyedIndex < lenToPop) {
+                var leftCount = lenToPop - copyedIndex;
+
+                var cur = queueBuff[0];
+                if (QueueBuff_dataLenOfRemoved != 0) {
+                    cur = cur.subarray(QueueBuff_dataLenOfRemoved);
+                }
+
+                if (cur.length <= leftCount) {
+                    //dataToPop 数据长
+                    vit.arrayConcat(dataToPop, cur);
+
+                    copyedIndex += cur.length;
+                    QueueBuff_dataLenOfRemoved = 0;
+
+                    queueBuff.shift();
+                }
+                else {
+                    //queueBuff 数据长
+                    vit.arrayConcat(dataToPop, cur, leftCount);
+                    copyedIndex += leftCount;
+                    QueueBuff_dataLenOfRemoved += leftCount;
+                }
             }
-            var bytes = receive.slice(4, length + 4);
-            receive = receive.slice(length + 4);
-            return bytes;
+            return dataToPop;
         };
-    }
 
 
-    CL.DeliveryClient=function () {
+        var fileLen = -1;
+
+        //return bytes
+        this.readSersFile = function () {
+            if (fileLen < 0) {
+                var fileLen_bytes = read(4);
+                if (!fileLen_bytes) {
+                    return null;
+                }
+                fileLen = vit.bytesGetInt32(fileLen_bytes, 0);
+            }
+
+            if (buffLen < fileLen) return null;
+
+            var data = read(fileLen);
+            fileLen = -1;
+            return data;
+        };
+    };
+
+
+    CL.DeliveryClient = function () {
         var self = this;
         self.host = "ws://127.0.0.1:4503";
 
@@ -276,18 +324,12 @@
         // function () { }
         self.event_onDisconnected;
 
-
         self.sendFrame = function (bytes) {
-
             vit.bytesInsertInt32(bytes, 0, bytes.length);
-
             var dataView = vit.bytesToDataView(bytes);
-
             webSocket.send(dataView);
         };
 
-
-
         var pipe = new PipeFrame();
 
         var webSocket = null;
@@ -306,8 +348,6 @@
                 self.close();
             };
 
-
-
             //成功被调用 或者超时被调用
             var isCalled = false;
             var onCall = function (isSuccess) {
@@ -321,15 +361,13 @@
                 onCall(true);
             };
 
-
             webSocket.onmessage = function (event) {
                 var arrayBuffer = event.data;
-                var bytes = vit.arrayBufferToBytes(arrayBuffer);
-                pipe.write(bytes);
+                pipe.write(arrayBuffer);
 
                 //bytes
                 var frame;
-                while (frame = pipe.read()) {
+                while (frame = pipe.readSersFile()) {
                     try {
                         self.event_onGetFrame(frame);
                     } catch (e) {
@@ -337,12 +375,13 @@
                     }
                 }
             };
-
         };
 
+
         self.close = function () {
             if (!webSocket) return;
 
+
             //(x.1) close socket
             try {
                 webSocket.close();
@@ -351,49 +390,43 @@
                 logger.error(e);
             }
 
-            //(x.2) onDisconnected
-            if (self.onDisconnected) {
+            logger.info('[sers.CL]DeliveryClient.event_onDisconnected');
+
+            //(x.2) event_onDisconnected
+            if (self.event_onDisconnected) {
                 try {
-                    self.onDisconnected();
+                    self.event_onDisconnected();
                 } catch (e) {
                     logger.error(e);
                 }
             }
 
         };
-    }
+    };
 
 
     function RequestAdaptor() {
 
-
         var EFrameType = { request: 1, reply: 2, message: 3 };
-
         var ERequestType = { app: 0, heartBeat: 1 };
-
-        const organizeVersion = "Sers.Mq.Socket.v1";
-
+        var organizeVersion = "Sers.Mq.Socket.v1";
 
         var self = this;
 
-
         //  requestKey -> requestCallback
         var organizeToDelivery_RequestMap = {};
 
         var reqKeyIndex = 100;
 
-
         //事件,向外部delivery发送字节流时被调用
         //function (bytes) { }
         self.event_onSendFrame;
 
-
         //事件,delivery向Organize发送请求时被调用
         //function (requestData, callback) { }
         //callback: function(replyData){ }
         self.event_onGetRequest;
 
-
         //外部调用,当外部从delivery读取到数据时调用
         self.deliveryToOrganize_onGetMessageFrame = function (bytes) {
             //deliveryToOrganize_ProcessFrame
@@ -430,10 +463,7 @@
                 case EFrameType.message:
                     //TODO
                     break;
-
             }
-
-
         };
 
         function deliveryToOrganize_onGetRequest(requestType, reqKey_bytes, requestData) {
@@ -460,7 +490,6 @@
         }
 
         function deliveryToOrganize_sendReply(reqKey_bytes, replyData) {
-
             var repFrame = packageReqRepFrame(reqKey_bytes, replyData);
             delivery_sendFrame(EFrameType.reply, 0, repFrame);
         }
@@ -498,9 +527,7 @@
 
 
         function delivery_sendFrame(msgType, requestType, bytes) {
-
             bytes.splice(0, 0, msgType, requestType);
-
             self.event_onSendFrame(bytes);
         }
 
@@ -510,26 +537,22 @@
             return vit.arrayConcat(reqKey_bytes, oriData);
         }
 
-        // 返回对象  {reqKey:reqKey, oriData:oriData}
+        // 返回对象  {reqKey:reqKey,reqKey_bytes:reqKey_bytes, oriData:oriData}
         function unpackReqRepFrame(reqRepFrame) {
-
             var reqKey = vit.bytesGetInt32(reqRepFrame, 0);
-
             return { reqKey: reqKey, reqKey_bytes: reqRepFrame.slice(0, 8), oriData: reqRepFrame.slice(8) };
         }
 
-
     }
 
 
     //websocketHost demo: "ws://127.0.0.1:4503"
-    CL.OrganizeClient=function (websocketHost) {
+    CL.OrganizeClient = function (websocketHost) {
 
         var self = this;
 
         var delivery = new CL.DeliveryClient();
 
-
         //连接秘钥,用以验证连接安全性。服务端和客户端必须一致
         self.secretKey = "SersCL";
 
@@ -551,27 +574,22 @@
                 requestAdaptor.deliveryToOrganize_onGetMessageFrame(bytes);
             };
 
-
             requestAdaptor.event_onGetRequest = function (requestData, callback) {
                 self.event_onGetRequest(requestData, callback);
             };
 
-
             requestAdaptor.event_onSendFrame = function (bytes) {
                 delivery.sendFrame(bytes);
             };
 
-
-
-            delivery.event_OnDisconnected = function () {
-                self.event_OnDisconnected.apply(self, arguments);
+            delivery.event_onDisconnected = function () {
+                if (self.event_onDisconnected)
+                    self.event_onDisconnected.apply(self, arguments);
             };
 
         })();
         //>>>>>>>>>>>>>>>>>
 
-
-
         //function (event) { }
         self.event_onDisconnected = null;
 
@@ -582,9 +600,7 @@
         //callback: function(replyData,isSuccess){ }
         self.sendRequest = function (requestData, callback) {
             requestAdaptor.sendRequest(requestData, callback);
-        }
-
-
+        };
 
         //callback:   function (isSuccess) { }
         self.connect = function (callback) {
@@ -595,42 +611,25 @@
                     callback(false);
 
                 //(x.2)进行权限校验
+                //setTimeout(function () {
                 self.sendRequest(vit.stringToBytes(self.secretKey), function (replyData, isSuccess) {
 
                     //(x.x.1)请求不成功
-                    if (!isSuccess) callback(false);
+                    if (!isSuccess) {
+                        callback(false);
+                        return;
+                    }
 
                     //(x.x.2)验证不成功
                     if (vit.bytesToString(replyData) != 'true') {
                         callback(false);
+                        return;
                     }
 
                     //(x.x.3)验证成功
                     callback(true);
-
                 });
-                return;
-
-
-                setTimeout(function () {
-
-                    self.sendRequest(vit.stringToBytes(self.secretKey), function (replyData, isSuccess) {
-
-                        //(x.x.1)请求不成功
-                        if (!isSuccess) callback(false);
-
-                        //(x.x.2)验证不成功
-                        if (vit.bytesToString(replyData) != 'true') {
-                            callback(false);
-                        }
-
-                        //(x.x.3)验证成功
-                        callback(true);
-
-                    });
-                }, 5000);
-
-                return;
+                //}, 5000);
             });
         };
 
@@ -638,7 +637,7 @@
             delivery.close();
         };
     }
- 
+
 })(sers.CL || (sers.CL = {}));
 
 
@@ -705,19 +704,6 @@
         };
 
 
-        //(bytes rpcContextData_OriData, bytes value_OriData)
-        //return bytes
-        ApiMessage.package = function (rpcContextData_OriData, value_OriData) {
-
-            var oriData = vit.int32ToBytes(rpcContextData_OriData.length)
-                .concat(rpcContextData_OriData,
-                    vit.int32ToBytes(value_OriData.length),
-                    value_OriData
-                );
-
-            return oriData;
-        };
-
 
         self.package = function () {
             return ApiMessage.package(rpcContextData_OriData, value_OriData);
@@ -740,7 +726,20 @@
             rpcContextData_OriData = files[0];
             value_OriData = files[1];
         };
-    }
+    };
+
+    //(bytes rpcContextData_OriData, bytes value_OriData)
+    //return bytes
+    ApiMessage.package = function (rpcContextData_OriData, value_OriData) {
+
+        var oriData = vit.int32ToBytes(rpcContextData_OriData.length)
+            .concat(rpcContextData_OriData,
+                vit.int32ToBytes(value_OriData.length),
+                value_OriData
+            );
+
+        return oriData;
+    };
 
     //ApiClient
     sers.ApiClient = function (organizeClient) {
@@ -796,7 +795,7 @@
         self.addApiNode = function (apiDesc, Invoke) {
             var apiKey = apiDesc.route + '_' + apiDesc.extendConfig.httpMethod;
             apiNodeMap[apiKey] = { apiDesc: apiDesc, Invoke: Invoke };
-        }
+        };
 
         //(string route, string httpMethod, string description, Invoke Invoke)
         //Invoke:   function(requestData_bytes,rpcData_object,reply_rpcData_object){}
@@ -810,7 +809,7 @@
                 }
             };
             self.addApiNode(apiDesc, Invoke);
-        }
+        };
 
         //apiRequestMessage bytes
         //return apiReplyMessage bytes
@@ -867,14 +866,13 @@
             );
             return apiReplyMessage_bytes;
         };
-    }
+    };
 
 
     //ServiceStation
     sers.ServiceStation = function () {
         var self = this;
 
-
         //(x.1) LocalApiService
         (function () {
             self.localApiService = new sers.LocalApiService();
@@ -884,9 +882,9 @@
         (function () {
 
             self.org = new sers.CL.OrganizeClient("ws://127.0.0.1:4503");
-            self.org.event_onDisconnected = function () {
-                logger.info('[sers.CL]org.event_onDisconnected');
-            };
+            //self.org.event_onDisconnected = function () {
+            //    logger.info('[sers.CL]org.event_onDisconnected');
+            //};
 
             self.org.event_onGetRequest = function (requestData, callback) {
                 var reply_bytes = self.localApiService.callApi(requestData);
@@ -904,7 +902,7 @@
             logger.info('[sers.ServiceStation]try stop...');
             self.org.stop();
             logger.info('[sers.ServiceStation] stoped.');
-        }
+        };
 
 
         //callback: function(isSuccess){}
@@ -923,9 +921,9 @@
                 //向服务中心注册localApiService
                 logger.info('[ServiceStation] regist serviceStation to ServiceCenter...');
                 var serviceStationInfo = {
-                    serviceStationName: '', serviceStationKey: '', stationVersion: '', info: {}
+                    serviceStationName: 'JsStation', serviceStationKey: '', stationVersion: '', info: {}
                 };
-                var deviceInfo = { deviceKey: 'JsStation' };
+                var deviceInfo = { deviceKey: '' + Math.random() };
                 var apiNodes = self.localApiService.getApiNodes();
 
                 var serviceStationData =
@@ -960,4 +958,3 @@
 
 })(sers);
 
- 

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dotnet/netcore/ServiceCenter/App.Gover.Gateway/wwwroot/JsStation/sers.ServiceStation.min.js


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.