找回密码
 加入
搜索
查看: 15491|回复: 21

[网络通信] 【已解决】当建立UDP连接的时候 怎么判断客户端离线

 火.. [复制链接]
发表于 2010-8-31 20:42:42 | 显示全部楼层 |阅读模式
本帖最后由 261869247 于 2010-9-3 09:26 编辑



当建立UDP 连接的时候 客户端发一个数据给服务端
服务端接收完数据以一个ini的文件名保存 并继续等待接收状态
如果这个时候客户端突然关闭 或者离线 服务端要怎么判断客户端离线
再删除服务器目录下的 【一大扎鬼.ini】 这个文件


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-8-31 20:43:55 | 显示全部楼层
主要就是服务端怎么判断客户端离线  比如 客户端直接关闭进程 或者停电什么的 大家帮忙看看
发表于 2010-8-31 22:25:52 | 显示全部楼层
定期发送一个封包 超时没有发送就算掉线把...
 楼主| 发表于 2010-9-1 08:28:58 | 显示全部楼层
本帖最后由 261869247 于 2010-9-1 11:42 编辑

我也是这么想的 关键是服务器怎么往客户端发包 不知道用什么函数
 楼主| 发表于 2010-9-1 11:57:28 | 显示全部楼层
不能沉了!!
发表于 2010-9-1 13:25:33 | 显示全部楼层
UDP无连接.
发送到服务端时,把IP也发过去.
服务器收到IP,定时发个消息到这个IP,让客户端去回复"i'm live"
发表于 2010-9-1 14:19:17 | 显示全部楼层
本帖最后由 C.L 于 2010-9-1 14:27 编辑

回复 4# 261869247

给你写一段代码,当客户上线时,发送自已的IP和在线信号,服务器端接收到客户端在线信号后,显示上线的IP地址和在线状态

下面的代码,先运行那个都可以正常使用,客户端按ESC键可以热键退出

服务器:
#include <GUIConstantsEx.au3>

Opt ('GUIOnEventMode',1)
$Form1 = GUICreate("Form1", 403, 143, 251, 162)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$l_IPAddress = GUICtrlCreateLabel('没有在线的Ip', 88, 56, 84, 25)
$l_status = GUICtrlCreateLabel('离线', 232, 56, 84, 33)
GUISetState(@SW_SHOW)

UDPStartup()
$connect = UDPBind(@IPAddress1, 12345)
If @error <> 0 Then
        MsgBox(0, "UDPBind", @error, 3)
        Exit
EndIf
$timer = TimerInit ()
While 1
        $BinData = UDPRecv($connect, 1024, 1)
        $str = BinaryToString ($BinData,4)
        If $str <> "" Then
                $aStr = StringSplit($str,"|")
                If $aStr[2] == "ok" Then
                        GUICtrlSetData ($l_IPAddress,$aStr[1])
                        GUICtrlSetData ($l_status,'在线')
                        $timer = TimerInit ()
                EndIf
        EndIf
        If TimerDiff ($timer) > 1000 Then
                GUICtrlSetData ($l_IPAddress,'没有在线的IP')
                GUICtrlSetData ($l_status,'离线')
        EndIf
WEnd

Func _exit()
        Exit
EndFunc


客户端:
HotKeySet ('{ESC}','_exit')

While 1
        ToolTip ("Client is Running",200,200)
        _UDPsend_String (@IPAddress1,@IPAddress1&"|ok")
        Sleep (500)
WEnd

Func _UDPsend_String($tagIP,$string)
        $bstring = StringToBinary ($string,4)
        UDPStartup()
        $udpsocket = UDPOpen($tagIP, 12345)
        UDPSend($udpsocket, $string)
        UDPCloseSocket($udpsocket)
        UDPShutdown()
EndFunc

Func _exit()
        Exit
EndFunc

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

发表于 2010-9-1 14:26:09 | 显示全部楼层
哦,知道了,测试一下显示高亮代码


Func _exit()
        Exit
EndFunc
 楼主| 发表于 2010-9-1 14:56:45 | 显示全部楼层
回复  261869247

给你写一段代码,当客户上线时,发送自已的IP和在线信号,服务器端接收到客户端在线信 ...
C.L 发表于 2010-9-1 14:19



    谢谢C.L 的代码 请问下可以用到外网吗? 服务端装到外网某台服务器 要是在网吧内部某个内网IP打开客户端 要是客户端关闭进程了 外网能判断他不在线吗
 楼主| 发表于 2010-9-1 15:00:45 | 显示全部楼层
有点明白了 是客户端间隔 500毫秒 循环发送数据给服务器 服务端间隔一秒判断次 客户端是否发送数据过来了
如果没有就视为离线 是这样吗?
 楼主| 发表于 2010-9-1 15:02:13 | 显示全部楼层
还有一点UDP 做的服务端支持多个客户端同时连接吗?
比如100来个这样的客户端会同时发送 服务端会不会卡!
发表于 2010-9-1 15:54:36 | 显示全部楼层
顶。。别沉了。。。
发表于 2010-9-1 17:13:11 | 显示全部楼层
回复 11# 261869247

谢谢C.L 的代码 请问下可以用到外网吗? 服务端装到外网某台服务器 要是在网吧内部某个内网IP打开客户端 要是客户端关闭进程了 外网能判断他不在线吗


可以用到外网,但有个条件,你内网中需要和外网连接的IP和端口,必须要在连接外网的路由中进行端口映射,把内网的IP和端口映射到外网
有点明白了 是客户端间隔 500毫秒 循环发送数据给服务器 服务端间隔一秒判断次 客户端是否发送数据过来了
如果没有就视为离线 是这样吗?

是这样的
还有一点UDP 做的服务端支持多个客户端同时连接吗?
比如100来个这样的客户端会同时发送 服务端会不会卡!


支持多个客户端同时连接,而且运行不会因为UDP连接而卡,不过连接效果就看你的代码了,UDP很容易丢包,特别是多个客户端(比如100个)同时连接时,服务器的UDP侦听可能不能同时处理的时候,丢包就很正常了,如果要保证不丢包,那就要自已处理UDP的握手机制,保证每个包都能接送到,这个问题是个难点,据我所知,目前好像没有更好的UDP握手代码
 楼主| 发表于 2010-9-1 17:26:09 | 显示全部楼层
回复  261869247



可以用到外网,但有个条件,你内网中需要和外网连接的IP和端口,必须要在连接外网 ...
C.L 发表于 2010-9-1 17:13



    谢谢了 ·~
 楼主| 发表于 2010-9-1 17:26:33 | 显示全部楼层
现在确实要保证120个人同时连接不丢包!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-25 13:50 , Processed in 0.093608 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表