1

我正在实现一个 ruby​​ 服务器来处理从 GPRS 模块创建的套接字。问题是当模块掉电时,没有迹象表明插座已关闭。

我正在做线程来处理同一个服务器的多个套接字。我要问的是:有没有办法在线程内使用计时器,在每次套接字输入后重置它,如果它达到超时,关闭线程?我在哪里可以找到有关此的更多信息?

编辑:未检测到套接字关闭的代码示例

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 
4

3 回答 3

1

我认为你需要一个心跳机制。

于 2012-04-06T05:12:10.903 回答
0

只需检查标准 API 超时:

require 'timeout'
status = Timeout::timeout(3){sleep(1)}
puts status.inspect
status = Timeout::timeout(1){sleep(2)}
于 2015-03-23T15:20:11.840 回答
0

猜测一下,您的套接字莫名其妙地关闭了,因为您没有捕获在远程端关闭它们时引发的异常。

您需要将连接处理程序包装在异常捕获块中。

在不知道您使用的是什么模块/模型的情况下,我只会捏造它并说您有一个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。从那里您可以看到导致它们的原因,并可能在其他地方更优雅地处理它们。

于 2012-04-06T09:22:00.213 回答