;----------------------服务器AdlibRegister("_accept")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$listIP = StringSplit(GUICtrlRead(GUICtrlRead($ListView1)),"|")
MsgBox(0,"S1",$listIP[1])
TCPSend($listIP[1],"sendClinet|123123")
Case $Button2
EndSwitch
_recv()
WEnd
Func _accept()
$ConnectedSocket = TCPAccept( $MainSocket)
$szIP = SocketToIP($ConnectedSocket)
$soket = UBound($OnList) + 1
ReDim $OnList[$all][2]
$OnList[$soket - 1][0] = $ConnectedSocket
$OnList[$soket - 1][1] = $szIP
EndFunc
Func _recv()
;;问题在这里了,如何循环接收客户机发送来的数据?当$ConnectedSocket收到客户端连接是返回Socket,循环第二次时就是-1了。研究了好久都没有办法,希望高人指点。
;;多客户端向服务器发送数据
;;在网上找了一些列子,但都未有处理该问题的。都是些在线列表或单向传送信息的。
For $i = 1 To UBound($OnList) - 1 ;;;;我自己整了各笨办法,但这个不行
$recv = TCPRecv($OnList[$i][0], 2048)
If @error Then
MsgBox(0,"","recv_Error")
ElseIf $recv <> ""
;....................处理内容
EndIf
Next
EndFunc
;-------------------------------客户端While 1
$recv = TCPRecv($socket, 2048)
If @error Then
_conn()
Else
_comm($recv)
EndIf
WEnd
Func _comm($str)
If $str = "ser" Then
ElseIf StringLeft ($str,10) = "sendClinet" Then
MsgBox(0,"C2",$str,5)
TCPSend($socket,"Client")
EndIf
EndFunc
Func _conn()
$socket = TCPConnect( "192.168.1.188", 10008 )
If @error Then
MsgBox(0,"C1","连接错误")
Else
TCPSend($socket,"Online|"&@ComputerName&"")
EndIf
EndFunc
现在的问题是,当N多客户端没过3分钟向服务器发送一个消息,服务器的$recv = TCPRecv($ConnectedSocket 2048)中的$ConnectedSocket 如何变换socket接收每个客户端的消息。比如,当10台机器已经和服务器建立连接后,由于服务器的$recv = TCPRecv($ConnectedSocket 2048)一直在循环中,等三分钟后,客户端开始向服务器发送消息,此时服务器的$ConnectedSocket 是-1,无法接收消息。我上面的代码中已经将socket存储在数组中,但就是在$recv = TCPRecv($ConnectedSocket 2048)这个循环体中如何变换数组中的socket已接受消息。 For $i = 1 To UBound($OnList) - 1 $recv = TCPRecv($OnList[$i][0], 2048)这两句会导致很多消息接收不到。尤其是客户端向服务器发送文件的时候。 |