sliqi 发表于 2010-10-8 13:49:40

S/C程序问题,(已解决)

本帖最后由 sliqi 于 2010-10-9 23:15 编辑

我想写一个Server端显示 如图中客户机在线
但我的Client端无法实现给S端发客户机名称,只能发送IP地址。

听说论坛上有,我一时找不到,请大侠给个例子。



C.L 发表于 2010-10-8 17:06:21

本帖最后由 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:07:31

本帖最后由 C.L 于 2010-10-8 17:09 编辑

发贴重复了,晕

lxz 发表于 2010-10-8 17:19:25

学习了......

lxz 发表于 2010-10-8 17:20:03

自由天空的软件高手.

转角遇到囜 发表于 2010-10-8 22:28:33

哇,原来自由天空那么多AU3高手

sliqi 发表于 2010-10-9 00:59:06

嗯。谢谢,我研究下,看看能不能整合到上面图片中那样。非常感谢。

menfan1 发表于 2010-10-9 11:43:22

呵呵,C/S结构学习一下。。怎么不用TCP呢

006001 发表于 2010-10-9 13:19:44

要以用TCP的。

liufenglg 发表于 2010-10-9 17:47:27

回复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:05:10

本帖最后由 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

C.L 发表于 2010-10-9 22:09:00

回复 8# menfan1

我这个只是演示Client向Server端发送自已的名称而已,UDP和TCP原理基本一样,这种方法同样可以使用。

sliqi 发表于 2010-10-9 23:14:10

非常感谢。
帮我解决了如果Client不在线 而Listview还是在线问题。
学习你的代码思路中。。。

ndyndy 发表于 2010-10-12 11:57:40

不愧为金牌会员

病毒专收员 发表于 2010-10-15 22:05:08

{:face (303):} 标记,备用
页: [1] 2
查看完整版本: S/C程序问题,(已解决)