2012-04-06 82 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超时:

​​