Lua TCP 服务器脚本(协程实现)

写一个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("服务器已停止")

代码详细说明

  1. 初始化部分:

    • 引入LuaSocket库提供网络功能

    • 创建TCP服务器并绑定到9932端口

    • 设置服务器为非阻塞模式

  2. 客户端处理协程:

    • 等待并接受客户端连接

    • 处理客户端发送的命令:

      • "running": 开始发送"ok"消息

      • "stop": 发送"not ok"并准备退出

    • 使用coroutine.yield()让出执行权

  3. 消息发送协程:

    • 当运行标志为true时,每秒发送"ok"消息

    • 使用socket.sleep(1)实现1秒间隔

  4. 主循环:

    • 交替执行两个协程

    • 检测到stop命令后退出循环

    • 包含短暂休眠以减少CPU占用

  5. 退出处理:

    • 关闭客户端连接

    • 关闭服务器套接字

    • 打印退出信息

使用说明

  1. 保存为tcp_server.lua

  2. 运行脚本: lua tcp_server.lua

  3. 使用telnet或nc连接测试:

    text

    telnet localhost 9932
  4. 发送命令:

    • 发送"running"开始接收"ok"消息

    • 发送"stop"停止服务并断开连接

注意事项

  • 需要安装LuaSocket库(可通过LuaRocks安装)

  • 此脚本在收到stop命令后会完全退出

  • 只支持单个客户端连接

  • 使用协程实现非阻塞IO操作

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值