Skip to content

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)。

验证方法:

  1. 用两台网络助手连 8080,都应每 2 秒收到 T=...。
  2. 断开一台,clients 表自动移除,另一台继续收到。

注意事项:

  • 回调里直接写 PLC 寄存器等于把控制权开放给能访问该端口的任何主机——暴露到不可信网段前务必加来源校验(见例程 3)。
  • s:close(sock) 才是断开指定客户端,服务器没有 set_transparent。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研