2012-09-24 30 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