主题
TCP 服务器例程 2:多客户端连接表 + 周期广播
这一页只讲这一个例程。同组其余例程、以及这个库的函数说明都在 05-04-tcp-server。
适用:同上 | 依赖模块:tcp_server timer plc | 难度:★★☆
场景:多台上位机都要实时看温度,设备每 2 秒把温度广播给所有已连接客户端。
完整代码(可直接下载运行):
lua
tcps = tcp_server.creat(8080, 5, 2048)
clients = {} -- 用表维护在线客户端
tcps:reg(tcp_server.CONNECTED, function(sock, ip) clients[sock] = ip end)
tcps:reg(tcp_server.DISCONNECTED, function(sock) clients[sock] = nil end)
tcps:reg(tcp_server.RECVDATA, function(sock, data)
if data == "AUTH secret\n" then return end -- 简单接入校验占位
tcps:send(sock, "unknown\n")
end)
tcps:start()
timer.start(2000, function()
local msg = string.format("T=%.2f\n", plc.df(100))
for sock in pairs(clients) do tcps:send(sock, msg) end
end)要点:
max_sockets必须显式加大;用clients表记录CONNECTED/DISCONNECTED的sock。- 广播就是遍历
clients表逐个s:send(sock, data)。
验证方法:
- 用两台网络助手连 8080,都应每 2 秒收到
T=...。 - 断开一台,
clients表自动移除,另一台继续收到。
注意事项:
- 回调里直接写 PLC 寄存器等于把控制权开放给能访问该端口的任何主机——暴露到不可信网段前务必加来源校验(见例程 3)。
s:close(sock)才是断开指定客户端,服务器没有set_transparent。