找回密码
 加入
搜索
查看: 4664|回复: 10

[AU3]关于tcp命令的问题

[复制链接]
发表于 2008-9-18 12:35:49 | 显示全部楼层 |阅读模式
按AUTOIT帮助里的例子,可以得到的效果是

client        server
connet -> listen ->accept
sand   ->  Recv
以上是例子是参考[TCPRecv]的例子的

然后就引出一个问题.
当client正在与server通信的时候,client2再与server连接,虽然是连接上了.可是server取不到client2的信息
谁可以告诉我怎么往后该怎么写?

[ 本帖最后由 xigua0325 于 2008-9-18 13:52 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2008-9-18 12:46:05 | 显示全部楼层
server在while之前用TCPListen 监听端口
之后在While
退出的时候再关闭监听看看
 楼主| 发表于 2008-9-18 12:58:17 | 显示全部楼层
其实我一直就有个想法.AU3能不能做到两个线程以上呢

比如说上面的例子..当server正在listen的时候,server的窗口是关不了的,因为它在do...until

单线程就是说,当它与cilent通信的时候,listen就用不到.当在listen的时候,它也通信不了

不知道我的感觉有没有错.
发表于 2008-11-19 21:39:59 | 显示全部楼层
为什么发送中文的时候有错误?
发表于 2008-11-19 23:27:37 | 显示全部楼层
中文发送,转换一下字符再发送就是了。

TCP问题,用UDF试下。
发表于 2008-11-21 19:05:46 | 显示全部楼层
Do
        $accept = TCPAccept($listen)
       
Until $accept <> -1
问题就在这里,只要有连接$accept就<>-1,该循环就退出了。
au3没有提供多线程函数,你可以试试使用timer这个控件,论坛里应该有人介绍过。
While 1
   $accept = TCPAccept($listen)
   if $accept <>-1 then
      在这里启动timer控件来对该连接操作,为了能控制所有连接。这里还应该用个数组变量来
   保存这个$accept句柄
   endif
WEnd
发表于 2009-4-20 14:34:32 | 显示全部楼层

回复 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 编辑 ]
发表于 2009-4-20 18:01:45 | 显示全部楼层
在一个循环中处理TCPAccept和TCPRecv。TCPAccept有效则增加数组新单元,TCPRecv错误则删除数组相应单元。不断循环,直至用菜单项退出。
发表于 2009-4-20 18:29:39 | 显示全部楼层
大概例子如下:

Global $aConnected[1] = [0]

; 建立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[0] += 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[0] -= 1
                ElseIf $sRecv = "" Then   ; 客户端未发送数据,继续处理下一客户端
                        $i += 1
                Else
                        ; 接收数据处理。完成后TCPCloseSocket,然后删除数组单元并将 $aConnected[0] -= 1

                EndIf
        WEnd
        Return
EndFunc
发表于 2009-12-16 21:22:13 | 显示全部楼层
学习中,看来高手多多的呀
发表于 2009-12-19 13:41:27 | 显示全部楼层
学习了,俺网络类的知识有待学习!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 15:34 , Processed in 0.079182 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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