【已解决】当建立UDP连接的时候 怎么判断客户端离线
本帖最后由 261869247 于 2010-9-3 09:26 编辑当建立UDP 连接的时候 客户端发一个数据给服务端
服务端接收完数据以一个ini的文件名保存 并继续等待接收状态
如果这个时候客户端突然关闭 或者离线 服务端要怎么判断客户端离线
再删除服务器目录下的 【一大扎鬼.ini】 这个文件
主要就是服务端怎么判断客户端离线比如 客户端直接关闭进程 或者停电什么的 大家帮忙看看 定期发送一个封包 超时没有发送就算掉线把... 本帖最后由 261869247 于 2010-9-1 11:42 编辑
我也是这么想的 关键是服务器怎么往客户端发包 不知道用什么函数 不能沉了!! UDP无连接.
发送到服务端时,把IP也发过去.
服务器收到IP,定时发个消息到这个IP,让客户端去回复"i'm live" 本帖最后由 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 哦,知道了,测试一下显示高亮代码
Func _exit()
Exit
EndFunc
回复261869247
给你写一段代码,当客户上线时,发送自已的IP和在线信号,服务器端接收到客户端在线信 ...
C.L 发表于 2010-9-1 14:19 http://www.autoitx.com/images/common/back.gif
谢谢C.L 的代码 请问下可以用到外网吗? 服务端装到外网某台服务器 要是在网吧内部某个内网IP打开客户端 要是客户端关闭进程了 外网能判断他不在线吗 有点明白了 是客户端间隔 500毫秒 循环发送数据给服务器 服务端间隔一秒判断次 客户端是否发送数据过来了
如果没有就视为离线 是这样吗? 还有一点UDP 做的服务端支持多个客户端同时连接吗?
比如100来个这样的客户端会同时发送 服务端会不会卡! 顶。。别沉了。。。 回复 11# 261869247
谢谢C.L 的代码 请问下可以用到外网吗? 服务端装到外网某台服务器 要是在网吧内部某个内网IP打开客户端 要是客户端关闭进程了 外网能判断他不在线吗
可以用到外网,但有个条件,你内网中需要和外网连接的IP和端口,必须要在连接外网的路由中进行端口映射,把内网的IP和端口映射到外网
有点明白了 是客户端间隔 500毫秒 循环发送数据给服务器 服务端间隔一秒判断次 客户端是否发送数据过来了
如果没有就视为离线 是这样吗?
是这样的
还有一点UDP 做的服务端支持多个客户端同时连接吗?
比如100来个这样的客户端会同时发送 服务端会不会卡!
支持多个客户端同时连接,而且运行不会因为UDP连接而卡,不过连接效果就看你的代码了,UDP很容易丢包,特别是多个客户端(比如100个)同时连接时,服务器的UDP侦听可能不能同时处理的时候,丢包就很正常了,如果要保证不丢包,那就要自已处理UDP的握手机制,保证每个包都能接送到,这个问题是个难点,据我所知,目前好像没有更好的UDP握手代码 回复261869247
可以用到外网,但有个条件,你内网中需要和外网连接的IP和端口,必须要在连接外网 ...
C.L 发表于 2010-9-1 17:13 http://www.autoitx.com/images/common/back.gif
谢谢了 ·~ 现在确实要保证120个人同时连接不丢包!!
页:
[1]
2