S/C程序问题,(已解决)
本帖最后由 sliqi 于 2010-10-9 23:15 编辑我想写一个Server端显示 如图中客户机在线
但我的Client端无法实现给S端发客户机名称,只能发送IP地址。
听说论坛上有,我一时找不到,请大侠给个例子。
本帖最后由 C.L 于 2010-10-8 17:08 编辑
回复 1# sliqi
可以让客户端将自已名称和IP地址一起发送给S端,S端收到后将数据分解出来显示
以前写过的一个判断客户端是否在线的例子,改动一下,增加了客户端将自已名称发送给S端并显示
代码如下:
Server端:
#include <GUIConstantsEx.au3>
#include <array.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&""&$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
Client端:
HotKeySet ('{ESC}','_exit')
While 1
ToolTip ("Client is Running",200,200)
_UDPsend_String (@IPAddress1,@IPAddress1&"|ok|"&@ComputerName)
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-10-8 17:09 编辑
发贴重复了,晕 学习了...... 自由天空的软件高手. 哇,原来自由天空那么多AU3高手 嗯。谢谢,我研究下,看看能不能整合到上面图片中那样。非常感谢。 呵呵,C/S结构学习一下。。怎么不用TCP呢 要以用TCP的。 回复sliqi
可以让客户端将自已名称和IP地址一起发送给S端,S端收到后将数据分解出来显示
以前写过 ...
C.L 发表于 2010-10-8 17:06 http://www.autoitx.com/images/common/back.gif
学习c/s。 本帖最后由 C.L 于 2010-10-9 22:12 编辑
回复 7# sliqi
其实你可以在贴子里直接提出,我帮你写了个ListView的显示,这里的难度主要是排除重复的IP列表,避免因循环而不停的将IP写入ListView,引入一个变量,将登录的IP存入列表里,然后对这个列表进行维护,再按列表输出到ListView里显示
我下面给出的实例只是维护单个IP,如果需要维护多IP的话,程序要复杂一点,这个留你慢慢写下代码体会吧,自已写一写
Server端:
#include <GUIConstantsEx.au3>
Opt('GUIOnEventMode', 1)
$Form1 = GUICreate("Form1", 403, 143, 251, 162)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$listview = GUICtrlCreateListView('客户名称|IP地址|在线状态', 0, 0, 403, 143)
GUISetState(@SW_SHOW)
UDPStartup()
$connect = UDPBind(@IPAddress1, 12345)
If @error <> 0 Then
MsgBox(0, "UDPBind", @error, 3)
Exit
EndIf
$timer = TimerInit()
$iplist = ""
While 1
$BinData = UDPRecv($connect, 1024, 1)
$str = BinaryToString($BinData, 4)
If $str <> "" Then
$aStr = StringSplit($str, "|")
If $aStr == "ok" Then
If StringInStr($iplist, $aStr) Then
$timer = TimerInit()
ContinueLoop
EndIf
GUICtrlCreateListViewItem($aStr & "|" & $aStr & "|OK", $listview)
$iplist &= $aStr & "|"
$timer = TimerInit()
EndIf
EndIf
If TimerDiff($timer) > 1000 Then
GUICtrlSendMsg($listview, 0x1009, 0, 0)
$iplist = ''
EndIf
WEnd
Func _exit()
Exit
EndFunc
Clinet端:
HotKeySet ('{ESC}','_exit')
While 1
ToolTip ("Client is Running",200,200)
_UDPsend_String (@IPAddress1,@IPAddress1&"|ok|"&@ComputerName)
Sleep (500)
WEnd
Func _UDPsend_String($tagIP,$string)
$bstring = StringToBinary ($string,4)
UDPStartup()
$udpsocket = UDPOpen($tagIP, 12345)
UDPSend($udpsocket, $bstring)
UDPCloseSocket($udpsocket)
UDPShutdown()
EndFunc
Func _exit()
Exit
EndFunc
回复 8# menfan1
我这个只是演示Client向Server端发送自已的名称而已,UDP和TCP原理基本一样,这种方法同样可以使用。 非常感谢。
帮我解决了如果Client不在线 而Listview还是在线问题。
学习你的代码思路中。。。 不愧为金牌会员 {:face (303):} 标记,备用
页:
[1]
2