Моя обратная оболочка будет печатать вывод команды «ls» только в первый раз, как я могу заставить ее печатать на сервере столько раз, сколько захочу?
require 'socket'
require 'open3'
def createClient(hostname, port)
s = TCPSocket.new hostname, port
while line = s.gets
if line == "exit"
s.close
end
stdin, stdout, stderr, wait_thr = Open3.popen3(line)
s.puts("#{stdout.read}")
end
end
createClient("127.0.0.1", 9090)
require 'socket'
def createServer(hostname, port)
server = TCPServer.new(hostname, port)
client = server.accept
loop do
message = gets.chomp
if message == "exit"
break
end
client.puts(message)
while line = client.gets
puts line
end
end
client.close
end
createServer("127.0.0.1", 9090)
Я ожидал, что сервер напечатает все команды ls, обработанные клиентом, но он напечатал только первую.
client.gets
продолжает прослушивать сокет, пока он не будет закрыт. так он там висит.
можно попробовать открыть тред для прослушивания сокета. Основной цикл слушает стандартный ввод и отправляет сообщение в сокет. так:
Thread.new do
while line = client.gets
puts line
end
end
loop do
message = gets.chomp
if message == "exit"
break
end
client.puts(message)
end
client.close
Не уверен, имеет ли это значение, но в строке, отправленной в popen3, отсутствует завершающая новая строка.