2015-08-19 111 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) –