找回密码
 加入
搜索
查看: 12812|回复: 31

[网络通信] 还是TCP通信问题,求助高手解释,谢谢!(己解决)

 火.. [复制链接]
发表于 2013-1-3 21:56:14 | 显示全部楼层 |阅读模式
本帖最后由 cfs43210 于 2013-1-7 10:46 编辑
While 1
                
        Switch @HOUR & @MIN & @SEC
                Case 080000 ;早上8点执行以下

                Case 200000 ;然后晚上8点又执行以下
        EndSwitch
        
        $recv = TCPRecv($ConnectedSocket, 1024 * 50, 1)
        If @error Then
                $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
                If $ConnectedSocket <> -1 Then
                        $sMsg = StringToBinary($reg & "|" & $ad1 & "|" & $ad2 & "|" & $zcxby & "|" & $scxby, 4)
                        TCPSend($ConnectedSocket, $sMsg)
                        ;Return 0
                EndIf
                
        ElseIf $recv <> "" Then;如果接收不为空

        EndIf
Sleep(100)
WEnd
这是客户端代码。请问这代码工作总是出问题,服务端对刚上线的客户端还可以,如果服务端一段时间没运行时,客户端是一直在运行。之后服务端再运行客户端就没在线。在线等待出手相助,谢谢!
发表于 2013-1-3 22:12:10 | 显示全部楼层
本帖最后由 annybaby 于 2013-1-3 22:14 编辑

为什么不顺手贴上服务端的代码让大家学习下??
再一看,竟然还只是一小段代码~~

评分

参与人数 1金钱 +10 收起 理由
cfs43210 + 10

查看全部评分

 楼主| 发表于 2013-1-3 22:22:09 | 显示全部楼层
        $ConnectedSocket = TCPAccept($MainSocket)
        If $ConnectedSocket <> -1 Then ;<>-1表示有新客户端连接
                $szIP_Accepted = SocketToIP($ConnectedSocket) ;socket转成
                $all = UBound($OnlineList) + 1
                ReDim $OnlineList[$all][2] ;在线列表数组增加
                $OnlineList[$all - 1][0] = $ConnectedSocket ;socket
                $OnlineList[$all - 1][1] = $szIP_Accepted ;ip
                
                $sRecv = TCPRecv($ConnectedSocket, 2048, 1)
                If $sRecv <> '' Then;如果接收的数据包不为空
                        
                        $edbmid = BinaryToString($sRecv, 4);将客户端发送的信息写到edit框中
                        $ConnectedSocket = -1
                        TCPCloseSocket($ConnectedSocket);发送过一次消息后关闭此连接。
                        Global $edlb = StringSplit($edbmid, "|")
                        $edbm = IniRead($ini, "Edit", $edlb[1], "NotFound")
                        
                        If $edlb[4]="" Or $edlb[5]="" Then
                                $edlb[4]="******"
                                $edlb[5]="******"
                        EndIf
                        
                        If $edbm <> "NotFound" And $edbm <> "NotFoundid" Then
                                $edbm = StringSplit($edbm, "|")
                                IniWrite($ini, "Edit", $edlb[1], $edbm[1] & "|" & $OnlineList[$all - 1][1] & "|" & $edbm[3] & "|" & $edbm[4] & "|" & $edlb[2] & "|" & $edlb[3] & "|" & $edlb[4] & "|" & $edlb[5])
                                GUICtrlCreateListViewItem($OnlineList[$all - 1][0] & "|" & $edlb[1] & "|" & $edbm[1] & "|" & $OnlineList[$all - 1][1] & "|" & $edbm[3] & "|" & $edbm[4] & "|" & $edlb[2] & "|" & $edlb[3] & "|" & $edlb[4] & "|" & $edlb[5], $ListView1)
                        EndIf
                        
                EndIf
        EndIf
服务端太长了取一部份,后面都是一样的。服务端应该没问题。
 楼主| 发表于 2013-1-3 22:36:32 | 显示全部楼层
While 1
        
        ToolTip("000",300,1)
        
        Switch @HOUR & @MIN & @SEC
                Case 080000 ;早上8点执行以下
        Sleep(1000)
        Case 200000 ;然后晚上8点又执行以下
                Sleep(1000)
        EndSwitch
        
        $recv = TCPRecv($ConnectedSocket, 1024 * 50, 1)
        If @error Then
                $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
                If $ConnectedSocket <> -1 Then
                        $sMsg = StringToBinary($reg & "|" & $ad1 & "|" & $ad2 & "|" & $zcxby & "|" & $scxby, 4)
                        TCPSend($ConnectedSocket, $sMsg)
                        ;Return 0
                        ToolTip("2222222222222", 800, 1)
                        Sleep(500)
                EndIf
                
        ElseIf $recv <> "" Then;如果接收不为空

        EndIf
        
        Sleep(100)
        ToolTip("111",500,1)
        Sleep(100)
WEnd
现在我这样测试循环,服务端没开,闪得慢,1秒。如果服务端开了,闪快一倍。如果一直是这样就没问题。不解。
发表于 2013-1-4 16:06:51 | 显示全部楼层
看不太懂程序要实现的功能。一般而言 一直运行着的是服务端,你的服务端为啥会一会儿开一会儿要关呢?
还有客户端连上后只是显示其发过来的信息,再TCPCloseSocket($ConnectedSocket),关闭了其套接字(socket)连接,而且没有将客户端IP等记录在数据库或文件内,等一会儿服务端关了,再运行服务端,服务端程序怎么会知道刚才那客户端在线呢。
 楼主| 发表于 2013-1-4 16:42:35 | 显示全部楼层
本帖最后由 cfs43210 于 2013-1-4 16:52 编辑

谢谢你回复!客户端发过来的信息再到ini找到显示出来。今天到客户端看,原来是装了还原精灵,因为这个客户端不是开机启动,而是另一个开机启动程序启动客户端。每次重启电脑是客户端不会运行,手动运行另一个程序,客户端可以运行。一开始以为是客户端程序问题。没在线客户端可能是用户重启了电脑。至于开机程序怎么不会运行客户端,原因不明。看了注册表启动项,没还原精灵也有客户端启动项。另一个问题怎么我服务端怎么不是一直在线,哈哈我是要用时才开。现在改了一下显示循环,测试几天看看是不是这个问题。
发表于 2013-1-4 16:43:45 | 显示全部楼层
回复 1# cfs43210
目测续连出的问题,第9行改一下,改成发送消息,循环不要弄的间隔这么短
第3行到敌6行可以通过AdlibRegister来实现
发表于 2013-1-4 16:46:51 | 显示全部楼层
回复 1# cfs43210
目测续连出的问题,第9行改一下,改成发送消息,循环不要弄的间隔这么短
第3行到敌6行可以通过AdlibRegister来实现
我做的客户端没有通过接受命令来判断连接是否存在,是一直连接
Func conn()
Do
Sleep (1000)
$Socket = TCPConnect(FileRead("\\192.168.0.88\IP.txt"),7788) 
Until $Socket <> -1
AdlibRegister ("sendx",5000)
AdlibRegister ("GMCALL",5000)
EndFunc
 楼主| 发表于 2013-1-4 16:57:07 | 显示全部楼层
谢谢!现在是手机上网晚上回去看看你代码。
 楼主| 发表于 2013-1-4 17:11:43 | 显示全部楼层
本帖最后由 cfs43210 于 2013-1-4 17:16 编辑

开始我也想到是不是时间过短。我是在内网测试,外网没试就升级了,刚升级一个小时看到60多个客户端在线。第二天开服务端才几个在线,按理应该越来越多才对啊。我想不可能这么多用户重启过电脑。代码应该还有问题。谢谢你提点!
发表于 2013-1-4 17:20:45 | 显示全部楼层
回复 10# cfs43210
你所有的操作都是建立在判断连接是否存在的前提下进行的。如果不能续连肯定是判断条件不对导致,所以问题只能是第9行有漏洞
第一次运行的时候因为根本不存在套连接所以第九行返回的肯定是error,但是当成功连接一次后就不一样了。
开始的建议是为了把功能独立一下,因为你的swich内容跟后面的没什么关系,不用写在一起。小循环用在建立套连接上,大循环用在做完指定操作以后。
其实总体问题不大,就是在判断连接是否存在的时候有问题

评分

参与人数 1金钱 +30 收起 理由
cfs43210 + 30

查看全部评分

 楼主| 发表于 2013-1-4 19:43:06 | 显示全部楼层
本帖最后由 cfs43210 于 2013-1-4 19:45 编辑

回复 11# love5173

看了你的代码,不是我想要的效果,你的小循环到服务端在线就退出循环。那我服务端如果退出再开就
看不到在线了。
发表于 2013-1-4 19:53:56 | 显示全部楼层
回复 12# cfs43210
我代码不是写给你的,那是我程序的里的。
你自己改改不就可以了
 楼主| 发表于 2013-1-4 20:04:47 | 显示全部楼层
回复 13# love5173

现在是客户发不出消息,离线可以看见
 楼主| 发表于 2013-1-4 20:06:03 | 显示全部楼层
本帖最后由 cfs43210 于 2013-1-4 20:12 编辑
Func conn()
        ;ToolTip("888888888888888888", 400, 1)
        Do
                Sleep(1000)
                Global $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
        Until $ConnectedSocket <> -1
    AdlibRegister ("Sendx",5000)
        ;AdlibRegister("GMCALL", 5000)
EndFunc   ;==>conn

Func Sendx()
;$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
        If @error Then
                ;If $ConnectedSocket <> -1 Then
                        $sMsg = StringToBinary($reg & "|" & $ad1 & "|" & $ad2 & "|" & $zcxby & "|" & $scxby, 4)
                        TCPSend($ConnectedSocket, $sMsg)
                        ;Return 0
                        ToolTip("01", 40, 1)
                        Sleep(400)
                ;EndIf
        EndIf
EndFunc   ;==>Sendx
奇怪这样怎么发不出消息
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 10:23 , Processed in 0.091785 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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