1

クライアントがサーバーソケットに接続できる基本的なネットワークロギングスクリプトを作成しています。ソケットから読み取られたすべてのデータはファイルに書き込まれます。

telnetに接続できるように持っているので、最初の行(Enterキーを押す前)がファイルに書き込まれますが、後続の行は書き込まれません。これを正しく機能させるには、何を変更する必要がありますか?

また、複数のリスニングソケットが同じファイルに書き込むことができるようにしたいのですが、マルチスレッドなしでこれを行う方法はありますか?

log_path ||= "./network-logs"
listen_port ||= 2509
minute_buffer = {now: Time.now, buffer: "" }
current_time = Time.now
current_date = Date.today.to_s
client = nil
Dir.mkdir(log_path) unless File.exists?(log_path)
f = File.new("#{log_path}/#{current_date}.txt", 'w')

def short_time
  "%02d" % Time.now.hour.to_s + ':' + 
  "%02d" % Time.now.min.to_s + ':' + 
  "%02d" % Time.now.sec.to_s
end

server = TCPServer.open(listen_port)
loop {                                  
  client = server.accept                
  f.puts "#{Time.now} Client Connected"
  puts "#{Time.now} Client Connected"
  current_time = Time.now               
  if minute_buffer[:now].min != Time.now.min 
    f.puts "##### Minute summary for #{minute_buffer[:now].to_s}: #{minute_buffer[:min]} :"
    puts "##### Minute summary for #{minute_buffer[:now].to_s}: #{minute_buffer[:min]} :"
    f.puts "##### #{minute_buffer[:buffer]}"
    minute_buffer[:now] = Time.now
    minute_buffer[:buffer] = ""
  end
  data = client.gets
  f.puts short_time + "  : " + data.to_s
  puts short_time + "  : " + data.to_s
  minute_buffer[:buffer] = minute_buffer[:buffer] + data.to_s
  if current_date != Date.today.to_s
    f.close
    current_date = Date.today.to_s
    f = File.new("#{log_path}/#{current_date}.txt", 'w')
  end
}
4

1 に答える 1

1

client = server.accept行をループの外に移動する必要があります。

...
server = TCPServer.open(listen_port)
client = server.accept # <- moved out of the loop
loop {                                  
  f.puts "#{Time.now} Client Connected"
...
于 2012-09-24T19:26:53.540 に答える