来源说明:本文参考 jleb/AHKsock、G33kDude/Socket.ahk 以及本站 Socket通信_TCP与UDP示例集 整理。本站已有 TCP/UDP 示例,这篇重点讲怎么选库、怎么理解 TCP/UDP、以及新手最容易误判的地方。
AHK 做网络通信时,最容易把 HTTP、WebSocket、TCP、UDP 混成一团。其实它们不是同一层东西。HTTP 和 WebSocket 是更上层的协议;TCP/UDP 更接近底层通信方式。你用 Socket 库时,通常要自己处理连接、收发、断线、消息边界和协议格式。
一、AHKsock 是什么
AHKsock 是一个对 Winsock API 的高层封装,项目说明里说它可以让你用纯 AHK 写客户端和服务端。它的示例包括:服务器监听客户端并发送数据、服务器向客户端发送文件、两个对等端互相连接聊天、主机名和 IP 查询。
它更适合想深入理解 Winsock、事件回调、连接状态的人。优点是示例比较完整,尤其是文件传输和对等聊天;缺点是函数式风格对新手来说阅读成本略高。
二、Socket.ahk 是什么
G33kDude 的 Socket.ahk 是基于 Bentschi 的 Socket Class 整理出来的类库。它的风格更像面向对象封装,代码通常围绕 SocketTCP、Bind、Listen、Accept、SendText、RecvLine 这些方法组织。
如果你只是想快速写一个本机小服务、局域网命令接收器、StreamDeck/浏览器按钮触发 AHK 函数,这种类库风格会更容易上手。
三、TCP 和 UDP 怎么选
TCP 是面向连接的,可靠、有顺序、会重传。适合文件传输、聊天、命令控制、需要确认消息完整到达的场景。
UDP 是无连接的,不保证到达、不保证顺序,但开销小、延迟低。适合状态广播、局域网发现、实时数据、允许丢包的场景。
- 发送命令、传文件、控制另一个脚本:优先 TCP。
- 广播“我在线”、局域网发现设备、频繁发送状态:可以考虑 UDP。
- 要和网页或浏览器实时通信:优先看 WebSocket。
- 只是请求接口:优先 HTTP。
四、一个 TCP 小服务的结构
下面是基于 Socket.ahk 风格的结构示意:监听本机端口,收到 HTTP GET 请求后调用 AHK 函数。这类思路很适合把 AHK 脚本变成一个本机小服务。
#Requires AutoHotkey v1.1
#NoEnv
#Persistent
#SingleInstance Force
#Include <Socket>
Server := new SocketTCP()
Server.OnAccept := Func("OnAccept")
Server.Bind(["127.0.0.1", 1337])
Server.Listen()
return
OnAccept(server)
{
sock := server.Accept()
request := StrSplit(sock.RecvLine(), " ")
if (request[1] != "GET")
{
sock.SendText("HTTP/1.0 501 Not Implemented`r`n`r`n")
sock.Disconnect()
return
}
name := LTrim(request[2], "/")
if IsFunc(name)
{
SetTimer, % name, -0
sock.SendText("HTTP/1.0 200 OK`r`n`r`n")
}
else
{
sock.SendText("HTTP/1.0 404 Not Found`r`n`r`n")
}
sock.Disconnect()
}
Example()
{
MsgBox, 收到本机请求
}
这个例子的重点不是写一个完整 Web 服务器,而是说明:TCP Socket 可以让外部工具通过端口触发 AHK。实际使用时建议只绑定 127.0.0.1,避免局域网或公网机器随便访问。
五、消息边界是 TCP 新手第一坑
TCP 是字节流,不是“你 Send 一次,对方 Recv 一次”。一次发送的数据可能被拆开,也可能和下一次数据粘在一起。所以正式协议必须有消息边界。
常见做法:
- 每条消息以换行结尾,用
RecvLine()读取。 - 消息前加长度,例如前 4 字节表示正文长度。
- 使用 JSON Lines:一行一个 JSON。
- 文件传输时先发文件大小,再循环接收固定长度。
; 简单协议示意:一行一条命令 ; PING`n ; RUN|notepad.exe`n ; TEXT|hello world`n
如果你没有设计消息边界,脚本在小数据量测试时可能没问题,一到实际环境就会出现“偶尔少半截”“两条消息连一起”的怪问题。
六、端口、地址和防火墙
本机通信优先绑定 127.0.0.1。这表示只有本机能访问,安全很多。绑定 0.0.0.0 或局域网 IP 时,其他机器也可能连进来,就要考虑防火墙、权限和身份验证。
端口不是随便用的。小于 1024 的端口可能需要权限,常用端口可能被其他程序占用。测试脚本建议使用 10000 以上的端口,出问题时先检查端口是否已被占用。
; 查看某端口是否被占用,可以配合系统命令: ; netstat -ano | findstr :1337 ; 然后用任务管理器或 tasklist 查看对应 PID
七、库怎么选
我的建议是:
- 想学 Winsock 原理、文件传输、对等聊天:看 AHKsock。
- 想快速写本机 TCP 小服务:看 Socket.ahk。
- 要做 UDP 广播或复杂网络场景:优先看站内已有 TCP/UDP 示例,再决定用哪个库。
- 要和网页通信:不要用裸 TCP,优先 WebSocket。
无论选哪个库,都不要忽略协议设计。Socket 库只负责把字节送出去,真正决定脚本稳不稳的是:消息格式、边界、重连、超时、日志和异常处理。

评论(0)