【问题标题】:Lua Telnet Send & ReceiveLua Telnet 发送和接收
【发布时间】:2015-11-12 04:29:55
【问题描述】:

我正在尝试在 Lua 中创建一个简单的 telnet 会话。我浏览了互联网并没有找到解决我的问题的方法,即尝试发送和接收数据。

到目前为止,我有这个脚本,它接收数据,但我无法发送任何回报:

local socket = require "socket"
local ip, port = "avalon-rpg.com", 23
local server, err = socket.connect(ip, port)

if server == nil then
  print(err)
else
  while true do
    s, status, partial = server:receive()
    print(s or partial)
    if status == "closed" then
      break
    end
  end
end

server:close()

有人能告诉我我必须添加什么以便它接收输入并将其发送到服务器吗?提前致谢! :)

【问题讨论】:

    标签: sockets lua telnet game-development


    【解决方案1】:

    你必须要么发送接收,因为你不能同时做这两个。使用socket:setTimeout,您至少可以使 receiving 部分非阻塞。但是,Lua 中的文件 IO 总是阻塞的,所以你必须要么

    a) 使用外部库从标准输入读取而不阻塞程序流

    b) 限制程序的功能

    至于 b),您可以定义您的客户端在发送命令后始终等待响应(因此在您发出新命令之前,从服务器另外发送的文本将 可见)。我猜您想连接到MUD,这可能是一个合理的做法(尽管我不知道您尝试连接的具体 MUD)。

    一旦你弄清楚要做什么(使用外部库或无限期地等待用户输入),你就可以相对简单地发送你的命令:

    while true do
        local s, status, partial = server:receive()
        print(s or partial)
        if status == "closed" then
            break
        end
    
        -- Read from stdin
        local input = io.read("*l")
        if input ~= "" then
            server:send(input)
        end
    end
    

    【讨论】:

    • 感谢亨利克的回复。选项A是更安全的选择吗?我该怎么做呢?我在那里测试了你的代码 sn-p ,但这不是我想要的。我只是希望它具有与 telnet avalon-rpg.com 相同的功能。
    • 选项 A 显然是更好的选择,因为它允许用户以他们习惯的方式使用您的应用程序。不幸的是,似乎没有独立于平台的方式来做到这一点。看来您可以使用LuaLanes 来实现多线程,但我从未使用过它,也不能说什么。如果你在windows上,你可以使用winapi,在unix上你可以使用this function
    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 2015-03-31
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多