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
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。