2012-04-06 35 views
1

我正在實現一個ruby服務器來處理由GPRS模塊創建的套接字。事情是,當模塊掉電時,沒有跡象表明套接字已關閉。具有「看門狗」的Ruby線程

我做的線程來處理多個插座與在同一臺服務器。我問的是這樣的:有沒有辦法在一個線程中使用一個定時器,在每個套接字輸入後重置它,並且如果它超時,關閉線程?我在哪裏可以找到關於此的更多信息?

編輯:代碼示例不檢測插座關閉

require 'socket' 

server = TCPServer.open(41000) 
loop do 
    Thread.start(server.accept) do |client| 
     puts "Client connected" 

     begin 
      loop do 
       line = client.readline 

       open('log.txt', 'a') { |f| 
        f.puts line.strip 
       } 
      end 
     rescue 
      puts "Client disconnected" 
     end 
    end 
end 
+0

使用[EventMachine的(https://github.com/eventmachine/eventmachine)!因爲它是♥。 – omninonsense 2012-04-06 06:31:43

+0

事件機器在這種情況下如何提供幫助? – 2012-04-06 22:51:58

+0

你不能真正告訴套接字關閉。它可能需要幾個小時,幾天甚至幾個月,直到應用程序發現套接字關閉。您需要在客戶端(GPRS模塊)和您的服務器之間進行ping通。 – omninonsense 2012-05-18 21:47:50

回答

1

我想你需要一個心跳機制。

+0

你能解釋一下嗎? – 2012-04-06 22:51:44

0

在猜測,您的插座inexplably關閉,因爲你不追趕,當他們被遠端關閉所引發的異常。

你需要用連接處理器在異常捕獲塊。

不知道你用我只掰過來,什麼模塊/模型,假設你有一個process_connection程序。所以你需要做這樣的事情:

def process_connection(conn) 
    begin 
     # do stuff 
    rescue Exception => e 
     STDERR.print "Caught exception #{e}: #{e.message}\n#{e.backtrace}\n" 
    ensure 
     conn.close 
    end 
end 

這將捕獲所有異常並將它們轉儲到帶有堆棧跟蹤的stderr。從那裏你可以看到是什麼造成他們,並可能在別處更優雅地處理它們。

+0

我在來這裏之前試過了......但無濟於事......插座似乎並未關閉...... – 2012-04-06 22:51:19

+0

然後我無法猜測。請顯示一些代碼。 – 2012-04-07 04:52:07

0

只需選中STANDAR API超時:

​​