找回密码
 加入
搜索
查看: 4318|回复: 0

[网络通信] 服务端socket如何处理多客户端发送的消息(详进)

[复制链接]
发表于 2012-10-7 22:16:47 | 显示全部楼层 |阅读模式
;----------------------服务器
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)这两句会导致很多消息接收不到。尤其是客户端向服务器发送文件的时候。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 17:45 , Processed in 0.071230 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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