2

ログ情報を tcpsocket 経由でサーバーに送信し、監視クライアントをサーバーに接続してログ データを表示するようにコーディングしているアプリケーションがあります。これまでのところ、情報がサーバーに送信される段階に到達できましたが、次の段階に進む方法についていくつか考える必要があります. Ruby tcpseverを使用して、サーバーが受信データをクライアントに再送信するためにどのような方法を使用できますか? スレッド間でデータを保存するにはどうすればよいですか?

require "socket"  

server_socket = TCPServer.new('localhost', 2200)  

loop do  
  # Create a new thread for each connection.
  Thread.start(server_socket.accept) do |session|

    # check if received is viewer request
    line = session.gets
    if line =~ /viewer/
      @filter = line[/\:(.*?)\:/]
      session.puts "Listining for #{filter}"

      loop do
        if (log = ### need input here from logging app ###)
          # Show if filter is set for all or cli matches to filter
          if @filter == ':all:' || log =~ /\:(.*?)\:/
            session.puts log
          end

          # Read trace_viewer input. 
          if session.gets =~ /quit/
            # close the connections
            session.puts "Closing connection. Bye!"
            session.close
            break
          end
        end
      end
    end
  end  
end
4

1 に答える 1

0

クライアントがサーバーに接続すると、典型的なクライアント/サーバー構成のように聞こえます。一部のクライアントはデータを送信し、他のクライアントはデータを要求します。車輪を再発明する代わりに、標準の HTTP クライアント/サーバー、つまり Web サーバーを使用しない理由はありますか? Sinatra や Padrino、さらには Rails を使用すれば、ほぼ完了です。

スレッド間でデータを保存するにはどうすればよいですか?

Ruby の Thread モジュールにはQueue、スレッド間でデータを移動するのに適した が含まれています。ドキュメントページには、役立つ例があります。

キューを使用する場合と同じ考え方が、テーブルを使用する場合にも当てはまります。メモリ内ではなく、データベースをキューとして使用することをお勧めします。停電やアプリのクラッシュにより、データがメモリ内キューであり、クライアントがすべてを取得していない場合、すべてのデータが失われます。データベースの書き込みと読み取りは、データがそのような問題に耐えられることを意味します。

スキーマをシンプルに保ち、合理的なインデックスを提供してください。ほとんどの用途で十分に高速である必要があります。データベースをクリーンに保つにはハウスキーピング コードが必要ですが、SQL、または Sequel や ActiveRecord などの ORM を使用すると簡単です。

于 2011-03-21T01:56:56.290 に答える