261869247 发表于 2010-8-31 20:42:42

【已解决】当建立UDP连接的时候 怎么判断客户端离线

本帖最后由 261869247 于 2010-9-3 09:26 编辑



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


261869247 发表于 2010-8-31 20:43:55

主要就是服务端怎么判断客户端离线比如 客户端直接关闭进程 或者停电什么的 大家帮忙看看

rolaka 发表于 2010-8-31 22:25:52

定期发送一个封包 超时没有发送就算掉线把...

261869247 发表于 2010-9-1 08:28:58

本帖最后由 261869247 于 2010-9-1 11:42 编辑

我也是这么想的 关键是服务器怎么往客户端发包 不知道用什么函数

261869247 发表于 2010-9-1 11:57:28

不能沉了!!

thesnow 发表于 2010-9-1 13:25:33

UDP无连接.
发送到服务端时,把IP也发过去.
服务器收到IP,定时发个消息到这个IP,让客户端去回复"i'm live"

C.L 发表于 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 == "ok" Then
                        GUICtrlSetData ($l_IPAddress,$aStr)
                        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

C.L 发表于 2010-9-1 14:26:09

哦,知道了,测试一下显示高亮代码


Func _exit()
        Exit
EndFunc

261869247 发表于 2010-9-1 14:56:45

回复261869247

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


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

261869247 发表于 2010-9-1 15:00:45

有点明白了 是客户端间隔 500毫秒 循环发送数据给服务器 服务端间隔一秒判断次 客户端是否发送数据过来了
如果没有就视为离线 是这样吗?

261869247 发表于 2010-9-1 15:02:13

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

amwuujj 发表于 2010-9-1 15:54:36

顶。。别沉了。。。

C.L 发表于 2010-9-1 17:13:11

回复 11# 261869247


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


可以用到外网,但有个条件,你内网中需要和外网连接的IP和端口,必须要在连接外网的路由中进行端口映射,把内网的IP和端口映射到外网

有点明白了 是客户端间隔 500毫秒 循环发送数据给服务器 服务端间隔一秒判断次 客户端是否发送数据过来了
如果没有就视为离线 是这样吗?

是这样的

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


支持多个客户端同时连接,而且运行不会因为UDP连接而卡,不过连接效果就看你的代码了,UDP很容易丢包,特别是多个客户端(比如100个)同时连接时,服务器的UDP侦听可能不能同时处理的时候,丢包就很正常了,如果要保证不丢包,那就要自已处理UDP的握手机制,保证每个包都能接送到,这个问题是个难点,据我所知,目前好像没有更好的UDP握手代码

261869247 发表于 2010-9-1 17:26:09

回复261869247



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


    谢谢了 ·~

261869247 发表于 2010-9-1 17:26:33

现在确实要保证120个人同时连接不丢包!!
页: [1] 2
查看完整版本: 【已解决】当建立UDP连接的时候 怎么判断客户端离线