2015-08-19 413 views
0

我想要在Lua中工作一个简单的Telnet会话。我环顾了互联网,并没有找到解决我的问题的方法,它试图发送数据以及接收数据。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() 

可能有人请告诉我,我必须添加到此所以它会接收输入和发送它到服务器呢?提前致谢! :)

回答

1

你将不得不要么发送接受,因为你不能在任何一个时间一举两得。使用socket:setTimeout,你至少可以让接收部分非阻塞。然而,文件IO在Lua总是堵,所以你必须要么

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

二)限制程序的功能

至于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 
+0

感谢您的答复,亨里克。选项A是更安全的选择吗?我会怎么做呢?我在那里测试了你的代码片段,但这不是我想要的。我只是希望它具有与“telnet avalon-rpg.com”相同的功能。 –

+0

选项A显然是更好的选择,因为它允许用户以他们习惯的方式使用您的应用程序。不幸的是,似乎没有与平台无关的方式。看起来你可以使用[LuaLanes](https://github.com/LuaLanes/lanes)来实现多线程,但是我从来没有用过它,也不能说这些。如果你在windows上,你可以使用[winapi](http://stevedonovan.github.io/winapi/api.html#get_console),在unix上你可以使用[this function](http:// lua-users。组织/列表/ LUA-1/2014-03/msg00501.html) –