找回密码
 加入
搜索
查看: 3991|回复: 5

[网络通信] TCPSocket,请求url网页数据。向TCP高手请教一个问题。

  [复制链接]
发表于 2010-11-1 16:11:59 | 显示全部楼层 |阅读模式
下面是我写的使用TCPSocket去请求一个网页的功能函数。看上去代码没有任何问题,执行起来也没有问题。
但是在接收数据的时候,速度非常慢,请求一个网页往往需要30秒至一分钟的时间,这让我无法接受。不知道是何原因
请重点关注:Local $r = TCPRecv($socket, 1024) 这一行。
请有Socket编程经验的高手指点。
需要补充的是,我的网速正常,使用浏览器打开网址也非常正常。
Func WebRequest($url, $method="GET", $data="")
        Local $host
        $tempStart = StringInStr($url, "http://")
        If $tempStart = 0 Then
                $tempStart = 1
        Else
                $tempStart += StringLen("http://")
        EndIf
        $tempEnd = StringInStr($url, "/", Default, Default, $tempStart)
        If $tempEnd = 0 Then
                $host = StringMid($url, $tempStart)
        Else
                $host = StringMid($url, $tempStart, $tempEnd - $tempStart)
        EndIf
        ;ConsoleWrite($host)
        ; 开始 TCP 服务
        TCPStartup()
        Local $socket = -1
        $socket = TCPConnect(TCPNameToIP($host), "80")
        Local $sData = $method & " "& $url &" HTTP/1.1" & @CRLF
        $sData &= "Accept: */*" & @CRLF
        $sData &= "Accept-Language: zh-CN" & @CRLF
        $sData &= "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2;)" & @CRLF
        If $method = "POST" Then $sData &= "Content-Type: application/x-www-form-urlencoded" & @CRLF
        $sData &= "Host: " & $host & @CRLF
        $sData &= "Content-Length: " & StringLen($data) & @CRLF
        $sData &= "Connection: Keep-Alive" & @CRLF
        $sData &= "Pragma: no-cache" & @CRLF
        $sData &= @CRLF
        $sData &= $data
        TCPSend($socket, $sData)
        Local $text = ""
        While 1
                Local $r = TCPRecv($socket, 1024)
                If @error <> 0 Then ExitLoop
                If $r <> "" Then $text &= $r
        WEnd
        TCPCloseSocket($socket)
        TCPShutdown()
        Return $text
EndFunc
发表于 2010-11-1 18:53:10 | 显示全部楼层
为何要用socket来请求网址呢?

AU3的TCP的TIMEOUT都还没解决。
发表于 2010-11-1 19:01:45 | 显示全部楼层
如果不需要跟服务器进行交互的话,用 InetGet 请求网址就好啦!
 楼主| 发表于 2010-11-2 11:32:11 | 显示全部楼层
回复 3# baikaifang


    需要的,我这样做是为了不依赖IE,模拟浏览器的请求动作,自定义Header信息,修改Cookie信息等……。总之好处多多……
发表于 2010-11-2 12:41:55 | 显示全部楼层
回复 4# shang515

那我还是建议你用winhttp,既然有一个完整的应用层,就没必要绕远路用TCP了。
发表于 2010-11-2 12:43:44 | 显示全部楼层
回复 4# shang515

Au3 本身就是单线程运行,TCP接收数据时又是阻塞模式,效率是很低的,你可以试试用UDF WinHTTP 相关的函数。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-6 01:20 , Processed in 0.077350 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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