HTTP 请求适合“一问一答”,但实时日志、进度推送、浏览器控制面板和双向消息不适合不停轮询。WebSocket 建立连接后,AHK 和客户端可以随时互相发送数据,这正是 HttpServer.WebSocket_v1 要解决的问题。
这套资源面向 AutoHotkey v1,既可以用 WebSocketServer 单独监听一个 ws 端口,也可以通过 WebSocketSession 把 HttpServer_v1 收到的 HTTP/1.1 请求升级为 WebSocket。前一种方式适合快速做本地回声服务,后一种方式适合把普通 HTTP 路由和长连接放在同一个服务体系里。
服务端事件怎么组织
- OnOpen:握手完成并建立会话;
- OnMessage:收到 UTF-8 文本消息;
- OnData:收到二进制 Buffer;
- OnClose:取得关闭码和原因;
- OnError:处理握手、帧解析和连接异常。
每个客户端对应一个 WebSocketSession,并有独立的 id、路径、请求头和连接状态。session.SendText() 发送文本,SendBinary() 发送二进制,Close() 按关闭码结束连接。服务端对象维护 sessions 集合,关闭服务时会逐个结束现有会话。
库已经处理的协议细节
WebSocket 不是普通 TCP 文本流,里面还有握手、掩码、长度字段、文本帧、二进制帧、分片、Ping/Pong 和关闭帧。这些解析和组帧工作已经放进库中,业务层不需要自己逐字节处理。收到二进制消息时仍要根据自己的协议检查长度和字段,不要直接假设数据结构永远正确。
它和 WebSockets_v1 的区别
本批另一套 WebSockets_v1 同时提供独立客户端和服务端,更适合快速做 ws 客户端、测试工具或两端都由 AHK 控制的通信。HttpServer.WebSocket_v1 更偏服务端,价值在于能和 HttpServer_v1、HTTP.sys 请求上下文以及普通 HTTP 路由组合。
当前基础示例使用独立 WebSocketServer 监听 127.0.0.1,并不展示 TLS。若要对外提供加密连接,需要另外设计 HTTPS/WSS 入口、证书与部署方式,不能把本地 ws 示例直接当成公网方案。
安全边界要自己补齐
新手测试时先绑定 127.0.0.1。开放到局域网或公网前,应校验 Origin、身份令牌、消息大小和发送频率,并限制单个客户端可占用的资源。WebSocket 是长连接,异常客户端如果不限制消息和会话数量,比普通短请求更容易拖住脚本。
下面的完整示例启动一个本地回声服务:文本消息加上 echo 前缀返回,二进制数据原样返回。可以用浏览器 WebSocket 测试页或其他客户端连接 ws://127.0.0.1:18080/。
本文移植自 thqby 的 ahk2_lib,由本站适配为 AutoHotkey v1 版本,原作者及项目版权归其所有。
源项目地址:https://github.com/thqby/ahk2_lib
打包库和示例的下载地址:
蓝奏云:https://wwbtw.lanzouu.com/ipdeo3wuc3fg 提取码:ahk6
百度网盘:https://pan.baidu.com/s/1Ly6xEOPg2swVC_hMW_rV6A?pwd=ahk6 提取码:ahk6
demo代码片段展示:
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
#Persistent
#Include <HttpServer.WebSocket_v1>
port := 18080
server := new WebSocketServer(port, "127.0.0.1")
server.OnOpen := Func("WSS_OnOpen")
server.OnMessage := Func("WSS_OnMessage")
server.OnData := Func("WSS_OnData")
server.OnClose := Func("WSS_OnClose")
MsgBox, 64, WebSocket Server, % "Echo服务器正在监听 ws://127.0.0.1:" port "/`n打开websocket客户端并发送文本。`n按“确定”保持运行。按Esc键退出。"
return
Esc::
server.Close()
ExitApp
return
WSS_OnOpen(server, session) {
ToolTip, % "Client connected: #" session.id
SetTimer, WSS_ClearToolTip, -1200
}
WSS_OnMessage(server, session, data) {
session.SendText("echo: " data)
}
WSS_OnData(server, session, buf) {
session.SendBinary(buf)
}
WSS_OnClose(server, session, code, reason) {
ToolTip, % "Client closed: #" session.id " code=" code
SetTimer, WSS_ClearToolTip, -1200
}
WSS_ClearToolTip:
ToolTip
return

评论(0)