(转)hp socket 5.8.2 高性能网络扩展库

By admin at 2021-03-25 • 0人收藏 • 440人看过

感谢: fish 分享


aardio的扩展库里已经有个jacenHe提供的HPsocket库,位置如下:

image.png


此次分享的是由fish封装的, 目前只封装了 ssl http client 部分, 测试例子在 simple 目录下.

https://github.com/btx638/HP-Socket-bindings-for-aardio

有需要的可以学习下.


aaz.libhpsocket.7z


image.png

使用例子代码如下:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=466;bottom=144)
winform.add(
btnBaidu={cls="button";text="访问 baidu";left=25;top=16;right=156;bottom=47;z=2};
btnCnbeta={cls="button";text="访问 cnbeta";left=176;top=17;right=307;bottom=48;z=3};
edInfo={cls="edit";text="网页源码保存在同目录的  test.html";left=208;top=89;right=423;bottom=116;edge=1;multiline=1;readonly=1;z=1}
)
/*}}*/

io.open()

import aaz.libhpsocket.ssl.listener.httpClient;

var listener = aaz.libhpsocket.ssl.listener.httpClient();
var component = listener.createComponent();

listener.onPrepareConnect = function(component, connId, soListen){
	io.print("[onPrepareConnect]", connId, soListen)
}

listener.onConnect = function(component, connId){
	io.print("[onConnect]", connId)
} 

listener.onHandShake = function(component, connId){
	io.print("[onHandShake]", connId)
}

// 开始解析
listener.onMessageBegin = function(component, connId){
	io.print("[onMessageBegin]", component, connId)
	component.reallocString(1)
}

// 状态行解析完成 (仅用于 HTTP 客户端)
listener.onStatusLine = function(component, connId, usStatusCode, lpszDesc){
	io.print("[onStatusLine]", component, connId, usStatusCode,  lpszDesc )
}

// 请求头
listener.onHeader = function(component, connId, pszName, lpszValue){
	io.print("[onHeader]", component, connId, pszName, lpszValue)
}

// 请求头完成
listener.onHeadersComplete = function(component, connId){
	io.print("[onHeadersComplete]", component, connId)
	
	if(component.getHeader("Transfer-Encoding") == "chunked"){
		io.print("[onHeadersComplete]->分块传输")
	}
	else {
		io.print("[onHeadersComplete]->content-length", component.contentLength)
	}
		
	io.print("------all headers-----------")
	var headers = component.getAllHeaders()
	for(i=1;#headers;1){
		io.print( headers[i].name, headers[i].value )
	}
	
	io.print("------headers-----------")
	var headers = component.getHeaders("Set-Cookie");
	for(i=1;#headers;1){
		io.print(headers[i])
	}	
	
	io.print("------all cookies-----------")
	var cookies = component.getAllCookies()
	for(i=1;#cookies;1){
		io.print( cookies[i].name, cookies[i].value )
	}	
}

// Chunked 报文头
listener.onChunkHeader = function(component, connId, iLength){
	io.print("[onChunkHeader]", component, connId, iLength)
}

// Chunked 报文结束
listener.onChunkComplete = function(component, connId){
	io.print("[onChunkComplete]", component, connId)
}

// BODY 报文
listener.onBody = function(component, connId, pData, len){
	io.print("[onBody]", component, connId, pData, len)
	component.appendString(pData, len)
}

// 完成解析
listener.onMessageComplete = function(component, connId){
	io.print("[onMessageComplete]", component, connId)
	
	var html = component.getString();
	string.save("\test.html", html)
}

// 升级协议
listener.onUpgrade = function(component, connId, enUpgradeType){
	io.print("[onUpgrade]", component, connId, enUpgradeType)
}

// 解析错误
listener.onParseError = function(component, connId, iErrorCode, lpszErrorDesc){
	io.print("[onParseError]", component, connId, iErrorCode, lpszErrorDesc)
}

// Web Socket 数据包头
listener.onWsMessageHeader = function(component, connId, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen){
	io.print("[onWsMessageHeader]", component, connId, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen)
}

// Web Socket 数据包体
listener.onWsMessageBody = function(component, connId, pData, iLength){
	io.print("[onWsMessageBody]", component, connId, pData, iLength)
}

// Web Socket 数据包体
listener.onWsMessageComplete = function(component, connId){
	io.print("[onWsMessageComplete]", component, connId)
}

listener.onClose = function(component, connId){
	io.print("[onClose]", component, connId)
	component.reallocString(0)
}

component.setupSSLContext()

winform.btnCnbeta.oncommand = function(id,event){
	component.start("www.cnbeta.com",443)
	
	// 自己想办法在触发 onHandShake 事件后才运行
	component.sendGet(
		"/",
    	{
    		["user-agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36";
    		["accept-language"] = "zh-CN,zh;q=0.9,ja;q=0.8,zh-TW;q=0.7";  
		}
	)
}

winform.btnBaidu.oncommand = function(id,event){
	component.start("www.baidu.com",443)
	
	// 自己想办法在触发 onHandShake 事件后才运行
	component.sendGet(
		"/",
    	{
    		["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
    		["user-agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36";
    		["accept-language"] = "zh-CN,zh;q=0.9,ja;q=0.8,zh-TW;q=0.7";  
		}
	)	
}

winform.show();
win.loopMessage();





2 个回复 | 最后更新于 2021-04-04
2021-03-25   #1

我看了一下上面库的源码,仍然调用了  thread.callbackInitialize() 却没有对应的释放资源,建议删除这句代码 —— 带来的限制就是在他的线程回调里COM有关的功能都不能使用。

当然只有使用 HPSocket 才会遇到这问题,因为刚好你用这个才会有大量的代码只能写到回调线程里,而且这个线程又是HPSocket 创建的 —— 并且他又没有初始化COM套间,所以需要调用  thread.callbackInitialize() ,但是他又没有提供 OnWorkerThreadEnd 事件 —— 之前我是修改了 HPSocket 的源代码增加了这个事件,然后在里面调用 thread.callbackUninitialize 释放资源。因为这个组件实际上我除了封装过一次,后面没有用过,所以后面的版本没有再跟进了。



2021-04-04   #2

感谢回复,已删除 thread.callbackInitialize 相关代码

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
苏扬博客:苏扬博客
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
本 站 主 站:Stm32cube中文网
Htmlayout界面在线学习文档
Sciter中文在线文档Sciter在线学习文档
aardio在线手册Aardio在线手册

赞助商:才仁机械
下载站:非凡软件站
Loading...