分享:让VFP9拥有现代网络能力的两个类,支持 HTTP/2、TLS 1.2、TLS 1.3、WebSocket,附示例
前言:笔者接到一个单位用户需求,单位电脑不能升级,操作系统是windows 7 sp1,也不能升级操作系统,运行的的管理软件是VFP9开发的,有源码。
协作单位的系统升级后,数据推送,使用websocket方式,同时,要求数据提交支持TLS 1.3。
离职的原程序员,不接招,这家单位联系到我本人,我硬着头皮接了活。
怎么办呢?上RUST大法,利用RUST方便的生态,于是有了这个rustnet.dll,让VFP又行了,解决了用户的问题,也收到了大红包。
一、用途
这是给 Visual FoxPro 9 使用的 32 位网络 DLL,让vfp摆脱对windows WinHttp.WinHttpRequest.5.1 的依赖。
提供 HTTP 和 WebSocket客户端功能。
支持 HTTP/1.1、HTTP/2、TLS 1.2、TLS 1.3、WebSocket 和 WSS。
HTTP 响应可以解压 gzip、deflate、Brotli 和 Zstandard。
兼容ndows 7 SP1
TLS 由 rustls 实现,不使用 Windows 的 SChannel,所以 Windows 7 SP1上也能
连接 TLS 1.3 服务器。系统 Internet 选项里的 TLS 开关不会影响这个 DLL。
DLL 是 32 位文件,只依赖系统 DLL ,所以可(绿色运行):
advapi32.dll
bcrypt.dll
kernel32.dll
msvcrt.dll
ntdll.dll
user32.dll
ws2_32.dll
默认直接连接目标服务器。也可以指定已有的 HTTP 或 SOCKS5 代理,
可以通过 SetProxy() 使用 HTTP、HTTPS、SOCKS5 和 SOCKS5H 代理。
二、vfpnet.prg 面向 VFP9 的对象封装:
1、封装了VfpWinHttpRequest类,兼容 WinHttp.WinHttpRequest.5.1 的核心编程习惯,提供
Open、Send、SetRequestHeader、SetProxy、SetTimeouts、GetResponseHeader 和
GetAllResponseHeaders 等常用方法,以及 Status、ResponseBody、ResponseText 等常用属性。
已有的 WinHTTP 风格代码通常只需少量修改即可迁移。
在这种调用方式之上,VfpWinHttpRequest类还增加了 HTTP/2 状态、gzip、deflate、
Brotli、Zstandard 自动解压、SOCKS5/SOCKS5H 代理、最终 URL、详细诊断和
响应状态标志,并自动完成 ABI 校验。
2、提供独立的 VfpWebSocket 类,用于 WebSocket/WSS 连接、收发、事
件轮询和窗口通知。
三、示例
1、vfpnet.prg中的VFPHTTP() 是笔者使用最多的一个函数,演示了如何使用常规的HTTP能力。
代理支持:
使用 HTTP 代理:
loHttp = CREATEOBJECT("VfpWinHttpRequest")
=loHttp.SetProxy(2, "http://127.0.0.1:8080", "")
使用 SOCKS5 代理:
loHttp = CREATEOBJECT("VfpWinHttpRequest")
=loHttp.SetProxy(2, "socks5://127.0.0.1:1080", "")
使用 socks5:// 时,目标域名由本机解析。使用 socks5h:// 时,目标域名交给代理服务器解析。
代理地址可以带用户名和密码:
http://user:password@127.0.0.1:8080
socks5://user:password@127.0.0.1:1080
SetProxy() 的第三个参数是绕过列表。命中绕过列表的地址会直接连接,不经过
代理。设置为直接连接:
=loHttp.SetProxy(1, "", "")
2、使用 WebSocket示例
使用 PostMessage + BINDEVENT + Poll(0) 接收消息。Rust 后台线程只把
事件放进队列并向指定窗口投递通知,不会直接进入 VFP。窗口消息只携带连接
句柄和调用方 cookie,正文仍由 VFP 主线程通过 Poll(0) 读取。
Wolfx SeisJS Websocket实时测站示例
seisjs_live_stations.prg 连接公开的 SeisJS 测站数据流,不需要
Token,也不需要发送订阅报文:
DO seisjs_live_stations.prg
连接地址:
wss://seisjs.wolfx.jp/all_seis
示例使用 PostMessage + BINDEVENT + Poll(0) 接收高频数据,并将每次消息处理
限制为最多 200 个事件;队列仍有数据时,再投递一条 VFP 窗口消息继续处理,
避免单次回调长时间占用界面线程。
窗口按测站 UUID 汇总并显示地区、经纬度、PGA、PGV、PGD、JMA 震度、CSIS
烈度和更新时间,同时保留最近一条原始 JSON。服务端在连接时和每分钟发送
heartbeat JSON,示例收到后会回复官方建议的纯文本 ping。
官方字段中,type 是测站 UUID,时间字段主要是 update_at 和 create_at;
不能把文档外的示意字段当作固定协议。该公共数据只适合合法研究和开发,不能
替代官方地震预警、灾害信息或疏散指令。
官方文档:
https://wolfx.jp/zh/docs/seisjs-api/










