跳到主要内容

Lua UDP 示例

Lua 标准库不包含 socket API。要写 UDP 程序,常见选择是 LuaSocket。

这一节用 LuaSocket 写一个本地 UDP server 和 client。你会看到 Lua 如何发送和接收 UDP 数据包。

安装 LuaSocket

使用 LuaRocks:

luarocks install luasocket

在某些 Linux 发行版上,也可以使用系统包:

sudo apt install lua-socket

安装完成后测试:

check-socket.lua
local socket = require("socket")
print(socket._VERSION)

运行:

lua check-socket.lua

如果能输出版本信息,说明 LuaSocket 可用。

UDP server

创建 udp_server.lua

udp_server.lua
local socket = require("socket")

local udp = assert(socket.udp())
assert(udp:setsockname("127.0.0.1", 9000))
udp:settimeout(1)

print("UDP server listening on 127.0.0.1:9000")

while true do
local data, ip, port = udp:receivefrom()

if data then
print("received from " .. ip .. ":" .. port .. " -> " .. data)
udp:sendto("echo: " .. data, ip, port)
end
end

运行:

lua udp_server.lua

这个 server 会监听本机 9000 端口,收到消息后回发 echo: ...

UDP client

另开一个终端,创建 udp_client.lua

udp_client.lua
local socket = require("socket")

local udp = assert(socket.udp())
udp:settimeout(2)

assert(udp:sendto("hello", "127.0.0.1", 9000))

local data, ip, port = udp:receivefrom()

if data then
print("received from " .. ip .. ":" .. port .. " -> " .. data)
else
print("timeout")
end

udp:close()

运行:

lua udp_client.lua

输出类似:

received from 127.0.0.1:9000 -> echo: hello

server 终端会看到:

received from 127.0.0.1:xxxxx -> hello

UDP 的特点

UDP 和 TCP 不同:

  • UDP 是无连接协议。
  • 发送方不保证对方一定收到。
  • 包可能丢失、重复或乱序。
  • UDP 适合低延迟、可容忍丢包的场景。

在 IoT 场景中,UDP 常用于简单广播、局域网发现、实时数据上报等,但你需要自己设计超时、重试和数据校验。

设置超时

示例中使用:

udp:settimeout(2)

表示接收最多等待 2 秒。如果没有收到数据,receivefrom() 会返回 nil 和错误信息。

local data, err = udp:receivefrom()

if not data then
print(err)
end

小结

你需要掌握:

  • Lua 标准库不包含 socket,需要 LuaSocket 等第三方库。
  • socket.udp() 创建 UDP socket。
  • setsockname() 绑定本地地址和端口。
  • sendto() 发送 UDP 数据。
  • receivefrom() 接收 UDP 数据。
  • UDP 不保证可靠传输,需要你自己处理超时和重试。