2015-08-19 6 views
0

Я пытаюсь получить простой сеанс telnet, работающий в Lua. Я просмотрел Интернет и не нашел решения моей проблемы, которое пытается отправить данные, а также получить их.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) для достижения многопоточности, но я никогда не использовал его и ничего не могу сказать об этом. Если вы находитесь в окнах, вы можете использовать [winapi] (http://stevedonovan.github.io/winapi/api.html#get_console), в unix вы можете использовать [эту функцию] (http: // lua-users. орг/листы/Lua-л/2014-03/msg00501.html) –