找回密码
 加入
搜索
查看: 6702|回复: 12

[网络通信] S/C程序问题,(已解决)

 火.. [复制链接]
发表于 2010-10-8 13:49:40 | 显示全部楼层 |阅读模式
本帖最后由 sliqi 于 2010-10-9 23:15 编辑

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

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



本帖子中包含更多资源

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

×

评分

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

查看全部评分

发表于 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[2] == "ok" Then
                        GUICtrlSetData ($l_IPAddress,$aStr[3]&"  "&$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


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


先运行那个都可以

评分

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

查看全部评分

发表于 2010-10-8 17:07:31 | 显示全部楼层
本帖最后由 C.L 于 2010-10-8 17:09 编辑

发贴重复了,晕
发表于 2010-10-8 17:19:25 | 显示全部楼层
学习了......
发表于 2010-10-8 17:20:03 | 显示全部楼层
自由天空的软件高手.
发表于 2010-10-8 22:28:33 | 显示全部楼层
哇,原来自由天空那么多AU3高手
 楼主| 发表于 2010-10-9 00:59:06 | 显示全部楼层
嗯。谢谢,我研究下,看看能不能整合到上面图片中那样。非常感谢。
发表于 2010-10-9 11:43:22 | 显示全部楼层
呵呵,C/S结构学习一下。。怎么不用TCP呢
发表于 2010-10-9 13:19:44 | 显示全部楼层
要以用TCP的。
发表于 2010-10-9 17:47:27 | 显示全部楼层
回复  sliqi

可以让客户端将自已名称和IP地址一起发送给S端,S端收到后将数据分解出来显示

以前写过 ...
C.L 发表于 2010-10-8 17:06



    学习c/s。
发表于 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[2] == "ok" Then
                        If StringInStr($iplist, $aStr[1]) Then
                                $timer = TimerInit()
                                ContinueLoop
                        EndIf
                        GUICtrlCreateListViewItem($aStr[3] & "|" & $aStr[1] & "|OK", $listview)
                        $iplist &= $aStr[1] & "|"
                        $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

本帖子中包含更多资源

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

×
发表于 2010-10-9 22:09:00 | 显示全部楼层
回复 8# menfan1

我这个只是演示Client向Server端发送自已的名称而已,UDP和TCP原理基本一样,这种方法同样可以使用。
 楼主| 发表于 2010-10-9 23:14:10 | 显示全部楼层
非常感谢。
帮我解决了如果Client不在线 而Listview还是在线问题。
学习你的代码思路中。。。
发表于 2010-10-12 11:57:40 | 显示全部楼层
不愧为金牌会员
发表于 2010-10-15 22:05:08 | 显示全部楼层
标记,备用
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-18 23:46 , Processed in 0.097051 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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