还是TCP通信问题,求助高手解释,谢谢!(己解决)
本帖最后由 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这是客户端代码。请问这代码工作总是出问题,服务端对刚上线的客户端还可以,如果服务端一段时间没运行时,客户端是一直在运行。之后服务端再运行客户端就没在线。在线等待出手相助,谢谢! 本帖最后由 annybaby 于 2013-1-3 22:14 编辑
为什么不顺手贴上服务端的代码让大家学习下??
再一看,竟然还只是一小段代码~~{:face (189):} $ConnectedSocket = TCPAccept($MainSocket)
If $ConnectedSocket <> -1 Then ;<>-1表示有新客户端连接
$szIP_Accepted = SocketToIP($ConnectedSocket) ;socket转成
$all = UBound($OnlineList) + 1
ReDim $OnlineList[$all] ;在线列表数组增加
$OnlineList[$all - 1] = $ConnectedSocket ;socket
$OnlineList[$all - 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, "NotFound")
If $edlb="" Or $edlb="" Then
$edlb="******"
$edlb="******"
EndIf
If $edbm <> "NotFound" And $edbm <> "NotFoundid" Then
$edbm = StringSplit($edbm, "|")
IniWrite($ini, "Edit", $edlb, $edbm & "|" & $OnlineList[$all - 1] & "|" & $edbm & "|" & $edbm & "|" & $edlb & "|" & $edlb & "|" & $edlb & "|" & $edlb)
GUICtrlCreateListViewItem($OnlineList[$all - 1] & "|" & $edlb & "|" & $edbm & "|" & $OnlineList[$all - 1] & "|" & $edbm & "|" & $edbm & "|" & $edlb & "|" & $edlb & "|" & $edlb & "|" & $edlb, $ListView1)
EndIf
EndIf
EndIf服务端太长了取一部份,后面都是一样的。服务端应该没问题。 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秒。如果服务端开了,闪快一倍。如果一直是这样就没问题。不解。 看不太懂程序要实现的功能。一般而言 一直运行着的是服务端,你的服务端为啥会一会儿开一会儿要关呢?
还有客户端连上后只是显示其发过来的信息,再TCPCloseSocket($ConnectedSocket),关闭了其套接字(socket)连接,而且没有将客户端IP等记录在数据库或文件内,等一会儿服务端关了,再运行服务端,服务端程序怎么会知道刚才那客户端在线呢。 本帖最后由 cfs43210 于 2013-1-4 16:52 编辑
谢谢你回复!客户端发过来的信息再到ini找到显示出来。今天到客户端看,原来是装了还原精灵,因为这个客户端不是开机启动,而是另一个开机启动程序启动客户端。每次重启电脑是客户端不会运行,手动运行另一个程序,客户端可以运行。一开始以为是客户端程序问题。没在线客户端可能是用户重启了电脑。至于开机程序怎么不会运行客户端,原因不明。看了注册表启动项,没还原精灵也有客户端启动项。另一个问题怎么我服务端怎么不是一直在线,哈哈我是要用时才开。现在改了一下显示循环,测试几天看看是不是这个问题。 回复 1# cfs43210
目测续连出的问题,第9行改一下,改成发送消息,循环不要弄的间隔这么短
第3行到敌6行可以通过AdlibRegister来实现 回复 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 谢谢!现在是手机上网晚上回去看看你代码。 本帖最后由 cfs43210 于 2013-1-4 17:16 编辑
开始我也想到是不是时间过短。我是在内网测试,外网没试就升级了,刚升级一个小时看到60多个客户端在线。第二天开服务端才几个在线,按理应该越来越多才对啊。我想不可能这么多用户重启过电脑。代码应该还有问题。谢谢你提点! 回复 10# cfs43210
你所有的操作都是建立在判断连接是否存在的前提下进行的。如果不能续连肯定是判断条件不对导致,所以问题只能是第9行有漏洞
第一次运行的时候因为根本不存在套连接所以第九行返回的肯定是error,但是当成功连接一次后就不一样了。
开始的建议是为了把功能独立一下,因为你的swich内容跟后面的没什么关系,不用写在一起。小循环用在建立套连接上,大循环用在做完指定操作以后。
其实总体问题不大,就是在判断连接是否存在的时候有问题 本帖最后由 cfs43210 于 2013-1-4 19:45 编辑
回复 11# love5173
看了你的代码,不是我想要的效果,你的小循环到服务端在线就退出循环。那我服务端如果退出再开就
看不到在线了。 回复 12# cfs43210
我代码不是写给你的,那是我程序的里的。
你自己改改不就可以了 回复 13# love5173
现在是客户发不出消息,离线可以看见 本帖最后由 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奇怪这样怎么发不出消息