我正在实现一个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 发布于 2012-04-06 13:12:11
我认为你需要一个心跳机制。
发布于 2012-04-06 17:22:00
据猜测,您的套接字莫名其妙地关闭了,因为您没有捕捉到远程端关闭套接字时引发的异常。
您需要将连接处理程序包装在一个异常捕获块中。
在不知道您使用的是什么模块/模型的情况下,我只会胡编乱造,说您有一个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。从那里你可以看到是什么导致了它们,并可能在其他地方更优雅地处理它们。
发布于 2015-03-23 23:20:12
只需检查standar API超时:
require 'timeout'
status = Timeout::timeout(3){sleep(1)}
puts status.inspect
status = Timeout::timeout(1){sleep(2)}https://stackoverflow.com/questions/10039340
复制相似问题