我正在尝试为客户端/服务器网络项目创建会话超时系统。发生的事情是客户端连接并且在验证服务器时会创建一个保存超时,会话ID和线程句柄的会话对象。从这里开始,客户端每隔一段时间就发送一个保持活动的数据包,服务器将访问该会话对象并重置超时。
以下是一些代码,我将在底部解释每个函数:
nodeCache.rb
@nodeCache = []
def nodeAdd(nodeName)
nodeHash = {:nodeName => nodeName, :session => createSession(nodeName)}
@nodeCache.push(nodeHash)
return true
end
def nodeKeepAlive(nodeName)
@nodeCache.each do |node|
if node[:nodeName].eql? nodeName
session = node[:session]
session.timer.thread_variable_set(:expire, 10)
return true
end
end
return false
end
nodeAdd
方法只需要一个节点ID并创建一个哈希值存储在一个数组中,以便我可以轻松跟踪与该节点相关的未来数据。
nodeKeepAlive
函数遍历节点哈希数组,搜索保持活动的节点,一旦发现它抓取其会话对象并尝试重置线程,以便计时器重置为默认值。
NodeSession.rb
require "thread"
class Session
attr_reader :nodeName
attr_accessor :expire, :timer
def initialize(nodeName)
@nodeName = nodeName
@expire = 10
@timer = nil
end
end
def start(session)
expire = session.expire
alive = true
while (expire -= 1) > 0
puts "timer tick #{expire}"
sleep(1)
end
puts "timer expired"
alive = false
end
def createSession(nodeName)
session = Session.new(nodeName)
session.expire = 10
session.timer = Thread.new { start(session) }
return session
end
Session
类是一个存储节点名称,过期超时和线程句柄的对象。
start
方法是线程用来减少过期时间的方法,如果它达到0,它将通知我该节点的会话已超时(最终)。
createSession
方法创建一个新的会话对象,对其进行初始化,然后启动开始倒计时的线程,并返回要存储在哈希的节点缓存数组中的会话对象。
我遇到的问题是我无法从线程外部重置计时器。我已经尝试使用光纤局部变量赋值,线程局部变量赋值(thread_variable_set / get),并且只是尝试重置会话对象的到期,我无法弄清楚如何执行此操作。如果有人可以引导我阅读一些文档或阅读如何更改线程内的局部变量,我们将不胜感激。如果有人可以概述一种更好的方法来设置类似于此设置的保持活动系统,我甚至会接受。
感谢您的帮助!
答案 0 :(得分:0)
我建议你解决你的问题。我会保持高位,因为这是一个很长的问题。
创建会话时,请使用Time.now
获取当前时间并将其存储在属性last_access
中。
使用会话时:
if Time.now > (last_access + max_time)
# close the session and ask for open a new one
else
last_access = Time.now
#allow to continue
end