HVOT代码解读-前端板块造梦空间论坛-技术交流-造梦空间论坛

HVOT代码解读

HVOT是一个非常简单,大小甚至只有1.55kb的服务器协议,他允许创建一个支持2进制的信息通信频道,并且需要通过频道解密。

知识讲解

XHQ.5

XHG.5是一个XML HTTP REQUEST应用协议第五代,允许传输任意格式的网络请求,以及进行发,接的简单操作。在Ecute中自带XHG.3和XHG.5应用协议。

sin.tyx

tyx是一个后缀,他作为一个引导页,在一个目录中,只能拥有一个tyx作为编译引导。编译器将会编译tyx文件所在目录下所有的文件内容。

1-5 行

第一行通过reference引用了HOST_MAIN,他拥有Object Plus,Fs和filepath,filereader四大模块,常用与服务场景。

第二行sin创建了一个Object,需要注意的是,若在tyx文件中,使用let或者var创建的,名称和文件名(去除.sin)一致的,会作为全局对象,包含了system操作,全称External2Object。

第三行,通过getSystemConfig获得了是否一个注册组件,如果可以注册就将组件进行注册。此处不推荐使用getSystemConfigSync,因为这样会导致在没用确定是否可以加载的情况下就继续下文。

7-11行

第7行就使用了很标准的Anco语法:

/*[Anco]?=[filereader,/(?g)/,$c][/Anco]*/

其中filereader为模块名,/(?g)/的意思就是引用全部内容,g替换为a代表仅仅搜索模块,$c指的是同步加载。

第8行通过atExternal创建了一个全局的对象options,使用object.for从sin中(目前sin是全局)获得了name和component,然后通过in将name和component进行运行,给component添加name。

我们需要了解的是,name就和电脑的path一样,都是用于指定运行环境的,这边所从sin中获得的内容,就是从全局获得的内容,然后给sin的每一个模块,添加可以访问全局的功能。这样就可以弥补内部组件无法访问全局的损失,这比99%的程序员使用import导入要强的多。

13-14行

13行引入了filepath,在filereader中自动继承filepath,然后循环sin.os(external的os对象),给os对象手动附加options。

这段代码,我们使用filepath,可以获得隐藏的外部地址,不然我们是无法直接获得sin所代表的外部内容的。其中os不能被自动加入全局访问功能,所以我们需要用come重新给每一个os组件赋值。

17-29行

这段代码是非常平常的兼容性代码,就和XMLHTTPRequest和IE的控件一样的道理,此处不做讲解。

server.component.tyx.js

server是模块名,component代表是内部模块,tyx.js是ecute格式的js后缀。

第一行

第一行通过reference,设置模块来自sin,从main(主)中获得,type是component(模块),lsc是tyx(模块格式),extend是sin.tyx(继承sin.tyx),loading是lazy(懒加载)。

第三行

第三行设置了全局继承的模块,他的名称叫做try_server,简称tse。前面的主要是用于兼容性,其实作者完全可以直接写@extend,这样写一是编辑器支持,二是兼容性高。

5-14行

request是一个Request对象,我们需要通过他创建一个XHQ.5,端口为port。

dataListener是一个用于将任何进制转化为2进制。他需要传递一个listen(频率),如果没有设置listen,就设置为空。注意,listen就是我们所说的密码。

keepTimein是一个用于创建不间断运行的宏任务,他的频率是2ms一次,并且维持<Request pending>

request.offine是一个设置在线状态的函数,他设置在线状态为dataListener,就是所谓的数据听取器。

15-18行

发送信息,先获得startServer中的request。有人会问,这不是多此一举吗?我直接将request返回不就行了吗?

这其实是严重错误的,因为我们通过keepTimein,所有的内容都是挂载到keepTimein的,目前这个request,只是OffineReuqest,如果return,就会导致keepTimein还没启动,就将内容return出来,而不是return一个keepTimein的内存地址。

19-21

获得内容,此处通过filereader和Object获得了内容,获得的内容为原本格式。port代表端口,get为true为同步,为数字则获得将来数字(毫秒)内的数据。listen为频率,如果设置了频率,需要通过频率解码。

源码

sin.tyx:

/// <reference path="HOST_MAIN" />
let sin = {};
if (ref.getSystemConfig().canRegisterModule){
	ref.register(sin);
}

/*[Anco]?=[filereader,/(?g)/,$c][/Anco]*/
/*@[external]*/ var options = filereader(Object.for(name, component).from(sin).in((name, component)=>{
	component.name = name;
	return component;
}));

/*[Anco]?=[filepath,/(?g)/,$c][/Anco]*/
/*@[const]*/ var options = filereader(Object.come(Object.while(sin.os),options));


sign.reader = (name)=>{
	const name_type = filereader(Object.forAs(name)).name;
	if (name_type.name.AE4){
		return filereader(
			Object.for(name, component).form(sin,name_type).come((name, component)=>{
				return component;
			})
		);
	}else if (name_type.name.OP1){
		/// <reference path="ole" />
		ole.readComponent(name);
	}
}

server.component.tyx.js:

/// <reference module="sin" from="main" type="component" lsc="tyx" extend="sin.tyx" loading="lazy" />

/*@[component[][@extend]]*/ var try_server = {};

try_server.startServer = (port,listen)=>{
	const request = new Request("XHQ.5",port);
	const dataListener = new DataListener(listen,"");

	keepTimein(()=>{
		Object.for(request).in(request).to(request);
	});

	request.offine(dataListener);
}
try_server.send = (server,to,data)=>{
	const request = [*("Read_Sync")] filereader(Object.from(try_server.startServer).in(request)); //跨界读取
	request.sendObject(filereader(Object.from(to).while(object, component).in(data.length).to(keepTimein=>{[*("Object")]})));
}
try_server.get = (port,get,listen)=>{
	return filereader(Object.while(request.while(port,get,listen),"net_all_pwd").row());
}

 

请登录后发表评论

    没有回复内容

© 造梦空间论坛