[AU3]关于tcp命令的问题
按AUTOIT帮助里的例子,可以得到的效果是client server
connet -> listen ->accept
sand ->Recv
以上是例子是参考的例子的
然后就引出一个问题.
当client正在与server通信的时候,client2再与server连接,虽然是连接上了.可是server取不到client2的信息
谁可以告诉我怎么往后该怎么写?
[ 本帖最后由 xigua0325 于 2008-9-18 13:52 编辑 ] server在while之前用TCPListen 监听端口
之后在While
退出的时候再关闭监听看看 其实我一直就有个想法.AU3能不能做到两个线程以上呢
比如说上面的例子..当server正在listen的时候,server的窗口是关不了的,因为它在do...until
单线程就是说,当它与cilent通信的时候,listen就用不到.当在listen的时候,它也通信不了
不知道我的感觉有没有错. 为什么发送中文的时候有错误? 中文发送,转换一下字符再发送就是了。
TCP问题,用UDF试下。 Do
$accept = TCPAccept($listen)
Until $accept <> -1
问题就在这里,只要有连接$accept就<>-1,该循环就退出了。
au3没有提供多线程函数,你可以试试使用timer这个控件,论坛里应该有人介绍过。
While 1
$accept = TCPAccept($listen)
if $accept <>-1 then
在这里启动timer控件来对该连接操作,为了能控制所有连接。这里还应该用个数组变量来
保存这个$accept句柄
endif
WEnd
回复 1# xigua0325 的帖子
才看到这个帖子发一个我的想法
While 1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
; 获取客户端连接的IP地址
$szIP_Accepted = SocketToIP($ConnectedSocket)
; 尝试接收 100 个字节的数据
;----------------------------------------------------------------
$recv = TCPRecv($ConnectedSocket, 100)
; If the receive failed with @error then the socket has disconnected
;----------------------------------------------------------------
If @error Then
ConsoleWrite("接收信息错误 !!!" & @CRLF)
else
; 开始处理收到的数据
ConsoleWrite("收到来自IP:" & $szIP_Accepted & "的消息: " & $recv & @CRLF)
; 结束处理收到的数据
endif
WEnd
其中下边的语句
ConsoleWrite("收到来自IP:" & $szIP_Accepted & "的消息: " & $recv & @CRLF)
用于显示收到的消息,不要用msgbox函数,因为消息函数会导致脚本的暂停执行,从而导致无法
及时的接收到其他客户端发来的消息
其实,最重要的一点就是尽量缩短处理收到数据的时间,尽快让程序返回到Do....Until语句去接收
其他客户端的消息。
大家有什么好方法记得共享啊 qq:37361025
[ 本帖最后由 duxuetao1201 于 2009-4-20 14:38 编辑 ] 在一个循环中处理TCPAccept和TCPRecv。TCPAccept有效则增加数组新单元,TCPRecv错误则删除数组相应单元。不断循环,直至用菜单项退出。 大概例子如下:
Global $aConnected =
; 建立TrayItem,启动TCP,开始侦听端口。略
While 1
Switch TrayGetMsg()
Case $hExitItem
ExitLoop
Case Else
Accept()
Recv()
EndSwitch
WEnd
; 退出处理
Exit
Func Accept()
$ConnectedSocket = TCPAccept($MainSocket)
If $ConnectedSocket <> -1 Then
_ArrayAdd($aConnected, $ConnectedSocket)
$aConnected += 1
EndIf
Return
EndFunc
Func Recv()
$i = 1
While $i <= UBound($aConnected) - 1
$sRecv = TCPRecv($aConnected[$i], 256)
If @error Then ; 客户端已关闭
_ArrayDelete($aConnected, $i)
$aConnected -= 1
ElseIf $sRecv = "" Then ; 客户端未发送数据,继续处理下一客户端
$i += 1
Else
; 接收数据处理。完成后TCPCloseSocket,然后删除数组单元并将 $aConnected -= 1
EndIf
WEnd
Return
EndFunc
学习中,看来高手多多的呀 学习了,俺网络类的知识有待学习!
页:
[1]