写一个lua脚本 lua脚本作为tcp服务器端,端口号9932,等待客户端连接,客户端连接后,向tcp发送字符串running,tcp server收到running后,每间隔1秒向外发送 ok,当tcp 客户端发送stop后 ,tcp server收到stop后 发送一个not ok 后,同时退出脚本,停止运行,用协程实现 ,给出lua脚本和每行代码注释
Lua TCP 服务器脚本(协程实现)
以下是符合您要求的Lua TCP服务器脚本,使用协程实现,监听9932端口,根据客户端命令控制消息发送并退出:
lua
-- 引入socket库
local socket = require("socket")
-- 创建TCP服务器并绑定到9932端口
local server = assert(socket.bind("*", 9932))
print("TCP服务器已启动,监听端口9932...")
-- 设置服务器超时为0(非阻塞模式)
server:settimeout(0)
-- 定义客户端对象和运行状态
local client = nil
local running = false
-- 客户端处理协程
local client_co = coroutine.create(function()
print("等待客户端连接...")
while true do
-- 接受客户端连接
client = server:accept()
if client then
-- 设置客户端为非阻塞模式
client:settimeout(0)
local ip, port = client:getpeername()
print("客户端已连接:", ip, port)
while true do
-- 接收客户端数据
local data, err = client:receive("*l") -- 按行读取
if data then
data = data:lower():gsub("%s+", "") -- 清理输入数据
print("收到命令:", data)
if data == "running" then
running = true -- 设置运行标志
client:send("开始每秒发送'ok'...\n")
elseif data == "stop" then
running = false -- 清除运行标志
client:send("not ok\n")
print("收到stop命令,准备退出...")
return -- 退出协程
end
elseif err == "closed" then
print("客户端断开连接")
running = false
client:close()
client = nil
break -- 返回等待新连接状态
end
coroutine.yield() -- 让出执行权
end
end
coroutine.yield()
end
end)
-- 消息发送协程
local msg_co = coroutine.create(function()
while true do
if running and client then
-- 向客户端发送"ok"
local _, err = client:send("ok\n")
if err then
print("发送错误:", err)
running = false
end
end
-- 等待1秒
socket.sleep(1)
coroutine.yield() -- 让出执行权
end
end)
-- 主循环
print("服务器运行中,按Ctrl+C停止...")
while true do
-- 执行客户端协程
local client_status = coroutine.resume(client_co)
-- 执行消息发送协程
coroutine.resume(msg_co)
-- 如果客户端协程已结束(收到stop命令)
if not client_status then
break -- 退出主循环
end
-- 短暂休眠以减少CPU占用
socket.sleep(0.01)
end
-- 清理资源
if client then
client:close()
end
server:close()
print("服务器已停止")
代码详细说明
-
初始化部分:
-
引入LuaSocket库提供网络功能
-
创建TCP服务器并绑定到9932端口
-
设置服务器为非阻塞模式
-
-
客户端处理协程:
-
等待并接受客户端连接
-
处理客户端发送的命令:
-
"running": 开始发送"ok"消息
-
"stop": 发送"not ok"并准备退出
-
-
使用
coroutine.yield()让出执行权
-
-
消息发送协程:
-
当运行标志为true时,每秒发送"ok"消息
-
使用
socket.sleep(1)实现1秒间隔
-
-
主循环:
-
交替执行两个协程
-
检测到stop命令后退出循环
-
包含短暂休眠以减少CPU占用
-
-
退出处理:
-
关闭客户端连接
-
关闭服务器套接字
-
打印退出信息
-
使用说明
-
保存为
tcp_server.lua -
运行脚本:
lua tcp_server.lua -
使用telnet或nc连接测试:
text
telnet localhost 9932
-
发送命令:
-
发送"running"开始接收"ok"消息
-
发送"stop"停止服务并断开连接
-
注意事项
-
需要安装LuaSocket库(可通过LuaRocks安装)
-
此脚本在收到stop命令后会完全退出
-
只支持单个客户端连接
-
使用协程实现非阻塞IO操作
906

被折叠的 条评论
为什么被折叠?



