2012-09-24 29 views
1

我在写一个基本的网络日志脚本,客户端可以连接到我的服务器套接字,并且从套接字读取的所有数据都将写入文件。红宝石 - 在网络套接字上接收多行

我有它,所以我可以连接telnet和第一行(按下输入前)被写入文件,但后续行不写。为了使这项工作正常进行,我需要改变什么?

我也希望能够有多个监听套接字写入同一个文件 - 有没有办法做到这一点没有多线程?

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 
} 

回答

1

你必须移动client = server.accept线圈外:

... 
server = TCPServer.open(listen_port) 
client = server.accept # <- moved out of the loop 
loop {         
    f.puts "#{Time.now} Client Connected" 
... 
+0

这f.puts线也将有外循环移动,否则它会被列出数千次对于大量的数据,因为循环中不再有等待函数。 这也导致了这个脚本运行时的问题,它只适用于单个连接。尽管如此,这样做,并且在外部循环中使用异常处理来处理客户端断开连接,并且因此不在'client.gets'处读取数据不会导致问题。将试验并更新我的问题。 – bdx

+0

对。我的答案只是修复了错误。 – unnu

+0

确实如此。 – bdx