Foxtable(狐表)用户栏目专家坐堂 → 如何让客户端openQQ重连30秒后,不再尝试重连而关闭程序?像QQ尝试60秒失败后变灰头像离线


  共有1960人关注过本帖树形打印复制链接

主题:如何让客户端openQQ重连30秒后,不再尝试重连而关闭程序?像QQ尝试60秒失败后变灰头像离线

帅哥哟,离线,有人找我吗?
chen3728060
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
如何让客户端openQQ重连30秒后,不再尝试重连而关闭程序?像QQ尝试60秒失败后变灰头像离线  发帖心情 Post By:2016/12/21 9:24:00 [显示全部帖子]

在disconnected事件里,加了

 

messagebox.show(e.mode)

 

Mode值 对应原因
1 用户主动退出,例如关闭项目或执行QQClient的Stop方法。
2 用户被服务器踢出。
3 服务器在规定时间内容内没有收到用户的心跳信号。
4 同名用户在其他位置重新登录,导致当前登录被服务器中断。
5 服务器端关闭QQServer。

 

我自己电脑的客户端,我禁用了本地连接,软件就已经弹窗提示 1,确定以后,然后狐表开始尝试重连openQQ。服务器端设置的心跳超时是30秒,但是一直都没有看到客户端超过30秒后提示 3

 

我想要的效果是,网络断了(例如客户机器长期不动要进入睡眠状态了),然后狐表开始重连openQQ,重连30秒后,确定是心跳超时死了,就提示3,那我就可以通过判断这状态,执行 syscmd.project.exit()。我要客户端知道自己超时死亡后,自动关闭程序。请问怎么做到?就好比QQ,刚断线的时候会尝试重连60秒,连不上了,就会彻底变成灰色头像,离线状态,不再尝试。现在的openQQ,客户端断线了会一直尝试重连,一直尝试,死也不断气。。。

[此贴子已经被作者于2016/12/21 10:12:15编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
  发帖心情 Post By:2016/12/21 10:11:00 [显示全部帖子]

顶顶~


 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点色) 测试了一下其余的退出都有效,...  发帖心情 Post By:2016/12/21 10:54:00 [显示全部帖子]

你一台电脑,刚好就是测试不到本地连接断开的这个情况~


 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
  发帖心情 Post By:2016/12/21 10:59:00 [显示全部帖子]

按照mode 3的情况,理论上应该只有 服务器端会知道,看它的原话'服务器在规定时间内容内没有收到用户的心跳信号" ,客户端是发送心跳信号,服务器端是接受心跳信号。服务器也会给客户端发送心跳信号?

 

客户端貌似只知道发,一直发发发,客户端不能设置发超时,自己干掉自己


 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点色) 客户端应该也有心跳,取服务器...  发帖心情 Post By:2016/12/21 11:36:00 [显示全部帖子]

我帮你测试,5分钟后我回复


 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点色)以下是引用chen3728060在2016/12/21 ...  发帖心情 Post By:2016/12/21 17:32:00 [显示全部帖子]

求参考代码求参考代码~


 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
  发帖心情 Post By:2016/12/22 9:04:00 [显示全部帖子]

我的服务器是有防火墙,不能直接ping,用不了timeout的功能,只能用tryhost。但是tryhost又没有timeout的功能,我想写在disconnect事件里,断开连接30秒后执行tryhost,连接不上就关闭程序。怎么用代码设置30秒后才执行呢?

 

我爬帖找到延时的代码,大红袍老师写的

 

Dim LastTime As Date = Date.now
Do until (Date.Now - LastTime).TotalSeconds >= 2
    Application.doevents
Loop
msgbox("2秒后看到")

 

那我写的代码如下

 

Select Case e.Mode
    Case 3
        MessageBox.show("连接超时,请重新打开程序")
        Syscmd.Project.Exit()
    Case 4
        MessageBox.show("您已在其他地方的登陆,程序将被关闭")
        Syscmd.Project.Exit()
End Select

 

Dim LastTime As Date = Date.now
Do until (Date.Now - LastTime).TotalSeconds >= 2
    Application.doevents
Loop
msgbox("2秒后看到")

 

效果是断线后,先是停住2秒(此时客户端并没有尝试重连),然后弹出msgbox,然后openqq 的PopMessage弹出来,重连。

但是我想要的效果是  断线后,尝试重连,重连尝试2秒后,弹出msgbox

 

而且还有一个问题,就是我关闭软件的时候,一样会是先停住2秒,然后弹出msgbox,然后才能关闭,我一开始都以为软件无端端死了,突然才想起来是这个延时惹的祸。明显用户体验不行

 

请问有什么好的解决方法?

[此贴子已经被作者于2016/12/22 9:30:13编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点色)?用计时器吧。做一个计划任务,...  发帖心情 Post By:2016/12/22 10:30:00 [显示全部帖子]

这个真的是正解!问题解决

 

全部代码里定义一个整数变量

public TryConnectTimes  as integer = 0

 

在主窗口的timetick事件

If TryConnectHost("www.baidu.com") = False Then
    TryConnectTimes = TryConnectTimes+1
Else
    TryConnectTimes = 0
End If

If TryConnectTimes = 5 Then
    MessageBox.show("软件与服务器失去连接超过30秒,请重新打开")
    syscmd.project.Exit()
End If

 

timetick设置6000毫秒

[此贴子已经被作者于2016/12/22 10:31:36编辑过]

 回到顶部