1

Ruby 用のインタラクティブな telnet クライアントを作成しようとしています。現在のライブラリは非常に不足しているため、ユーザーが telnet を使用してリアルタイムでデータを合理化できるインタラクティブな gem を作成して、ライブラリに追加しようとしています。これを行うには、マルチスレッドを使用する必要があります。

t1 はユーザー入力を受け入れます。ユーザーは、アプリケーション全体でデータを入力する能力を常に持っている必要があります。ユーザーデータが送信されると、すぐにデータが返され、ブロックでキャッチされます{ |c| print c }。問題は、データを合理化してほしいということです。つまり、現在、何かを送信した後に返されるデータのみを取得します。コマンドを送信してから 1 分以内にデータを受信する必要があります。私たちは、常にデータが流れてくることを望んでいます。

この目的のために t2 を作成しました。t2 は、データが受信されるのを待ってから、その正規表現パターンが一致したときにそれを表示します。t2 の問題は、データが受信されない場合、ユーザーが情報を t1 に入力できないことです。

t3 は t1 と t2 に作用します。私の質問は、ユーザーが常にコンソールに入力してコマンドを送信し、同時にサーバーから常に情報を受信できるように、スレッドを整理するにはどうすればよいですか?

t1 = Thread.new {
  while true
    input = gets.chomp
    localhost.cmd(input) { |c| print c }
  end
}

t2 = Thread.new {
  puts localhost.waitfor("Prompt" => /[$%#>:?.|](\e\[0?m\s*)* *\z/)
}

t3 = Thread.new {
  t1.join
  t2.join
}

t3.join
4

1 に答える 1

0

問題は、データを合理化してほしいということです。つまり、今は何かを送信した後に返されたデータしか取得できません。

require 'thread'

user_data = Queue.new

t1 = Thread.new do
  loop do
    print "Enter data: "
    line = gets.chomp

    if line == ""
      user_data << "END_OF_DATA"
      break
    else
      user_data << line
    end

  end
end.join

t2 = Thread.new do
  processed_data = []

  loop do
    line = user_data.shift
    break if line == "END_OF_DATA"
    processed_data << line
  end

  p processed_data
end.join

あなたはこれを読みたいかもしれません:

https://www.rfc-editor.org/rfc/rfc854

于 2014-08-10T16:47:35.420 に答える