2

ruby 1.9.3 の PTY および io/console モジュールを使用して、telnet または ssh 経由で nCurses アプリケーションを実行する EventMachine サーバーを作成しようとしています。

require 'rubygems'
require 'socket'
require 'pty'
require 'io/console'
require 'eventmachine'

 module CursesServer
   def post_init
     puts "-- someone connected to the server!"
     @reader, @writer, @pid = PTY.spawn('ruby ./ncurses_app_to_run.rb')
     @reader.sync = true #No buffering stdout     
  end

   def receive_data(data)
     screen = @reader.read(<number_of_bytes>)
     puts "received: " + data # Log input on server side
     send_data screen
     close_connection if data =~ /quit/i
   end

   def unbind
     puts "-- someone disconnected from the server!"
  end
end

# Note that this will block current thread.
EventMachine.run {
  EventMachine.start_server "127.0.0.1", 8081, CursesServer
}

@reader.read に渡された引数の値をいじると、画面の一部をクライアント側に表示することができますが、クライアントの端末の実際のサイズを初期またはクライアントが端末のサイズを変更した後。

出力をクライアントの端末のサイズと同期するにはどうすればよいですか? telnet/netcat で可能ですか、それとも ssh のようなより堅牢なプロトコルを使用する必要がありますか?

前もって感謝します。

4

1 に答える 1

0

多分これはあなたを助けることができます。私は EventMachine と ZeroMQ を使用していますが、簡単に適応できるようです。

def run_command command
    _start = Time.now
    begin
      PTY.spawn( command ) do |r, w, pid|
        r.sync = true
        begin
          r.each do |line|
            $announce_socket.send_msg "LOG:#{line}"
          end
       rescue => ex
        puts "ERROR: #{ex.message}"
       end
     end
    rescue PTY::ChildExited => e
      $announce_socket.send_msg "CMD_PREMATURE_EXIT:#{e.message}"
      puts "command exited prematurely, notified UI"
    end
    $announce_socket.send_msg "CMD_EXIT:#{Time.now - _start}"
    puts "done running commmand (took #{Time.now - _start} seconds)"
  end
end

そしてリアクター部分:

$context = EM::ZeroMQ::Context.new(1)

def cleanup(exit_code = 0)
  EM::stop()
  exit exit_code
end

trap('INT') do
  cleanup
end

EM.run do

  $announce_socket = $context.socket ZMQ::DEALER, EMDEALERHandler.new
  $announce_socket.identity = MY_ID
  $announce_socket.connect "tcp://#{host_ip}:7777"

  # announce presence
  $announce_socket.send_msg "UP"
end

この後、データをプッシュするための ROUTER ソケットが必要になります。

于 2012-11-03T11:42:07.587 に答える