当前位置: 首页 > 工具软件 > XMPP4R > 使用案例 >

解决xmpp4r会自动断线的问题

况野
2023-12-01
使用xmpp4r连接gmail的时候,时间长了就会断,因为我只加了一个message callback,所以如果长时间空闲,则没有任何消息发过去。可能就是因为这个服务器才会断开的。

所以要定时发一个在线信息过去,这样肯定不会自动断线了。

在主函数start里:

def self.start
init_all()
t=Time.now
while true
#per 2 mins
sleep(1)
if Time.now - t > 120
set_online_xmpp_with_retry_login(@@xmpp_conn)
set_online_msn_with_retry_login(@@msnm)
t=Time.now
end
end
end


定时2分钟去发一个在线信息,这样服务器始终认为在线,就可以正常收到消息了。

发送在线信息:

def self.set_online_xmpp_with_retry_login(j)
begin
p=Jabber::Presence.new(:chat)
j.send(p)
Robot.debug_log("set online for xmpp")
rescue => detail
Robot.exception_log("set online error:",detail)
begin
connect_xmpp()
Robot.debug_log("reconnected for xmpp")
rescue => detail
Robot.exception_log("reconnect failed, please restart. error:",detail)
end
end
end


如果发送遇到异常,就尝试重新连接。


处理消息也加强了一些异常处理:

j.add_message_callback do |m|
begin
if m!=nil && m.body!=nil && !m.body.empty?
email=Robot.split_email(m.from)
msg_text=Robot.process_command(m.body,email)
return_msg=Jabber::Message::new(m.from,msg_text)
return_msg.type=m.type
@@xmpp_conn.send(return_msg)
end
rescue => detail
Robot.exception_log("process_command error:",detail)
end
end


传递的参数m有可能为nil,所以一定要检查一下。

全部源码在:http://code.google.com/p/whereisitcn/
功能很简单,是一个存储东西摆放位置的机器人。
 类似资料: