找回密码
 加入
搜索
查看: 16708|回复: 17

[网络通信] 【已解决】请问如何为Microsoft.XMLHTTP添加超时设置

  [复制链接]
发表于 2010-4-15 12:06:34 | 显示全部楼层 |阅读模式
本帖最后由 renxiaoyao 于 2010-4-16 00:44 编辑

MSXML2.ServerXMLHTTP是有setTimeouts的,但Microsoft.XMLHTTP没有

有没有其它办法可以给这个函数加个超时设置呢?谢谢!
Func _XmlHttp($URL)
   $nHTTP = ObjCreate ( "Microsoft.XMLHTTP" )
   $nHTTP.Open ( "get" , $URL , false )
   $nHTTP.setRequestHeader("Cache-Control", "no-cache")
   $nHTTP.setRequestHeader("Accept-Language", "zh-cn")
   $nHTTP.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");表示客户端提交给服务器文本内容的编码方式
   $nHTTP.setRequestHeader ("Cache-Control", "no-cache");返回消息中的Cache用于指定网页缓存
   $nHTTP.setRequestHeader ("Connection", "Keep-Alive");数据传递完并不立即关闭连接
   $nHTTP.send ()
   $nReturnWebS = BinaryToString ( $nHTTP.responseBody,4 ) 
   Return $nReturnWebS
   $nHTTP.Nothing
EndFunc

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-4-15 14:10:15 | 显示全部楼层
这个函数若使用MSXML2.ServerXMLHTTP,返回空白
所以还得用Microsoft.XMLHTTP,但它又没有超时设置
发表于 2010-4-15 15:58:57 | 显示全部楼层
没研究过,帮你顶下
发表于 2010-4-15 16:10:14 | 显示全部楼层
记得winhttp.winhttprequest组件好像可以设置超时
发表于 2010-4-15 16:13:12 | 显示全部楼层
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
                $oHTTP.SetTimeouts(15000, 15000, 15000, 15000) ;设置超时
                $oHTTP.setProxy (2, "222.92.117.241:80");设置代理
                $oHTTP.Open("GET", "http://www.ip138.com/ip2city.asp", False)
                $oHTTP.setRequestHeader("Cache-Control", "no-cache")
                $oHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
                $oHTTP.Send('')

评分

参与人数 1威望 +5 金钱 +20 收起 理由
afan + 5 + 20

查看全部评分

 楼主| 发表于 2010-4-15 20:53:20 | 显示全部楼层
谢谢各位!
我发现把"get"改成"GET",MSXML2.ServerXMLHTTP也不返回空值了

但是,winhttp.winhttprequest.5.1和MSXML2.ServerXMLHTTP遭遇了同样的问题
我明明已经登陆了那个网站,如果用Microsoft.XMLHTTP能返回我要的结果
但用其它两个返回的却是未登录的页面
为什么呢
 楼主| 发表于 2010-4-15 23:38:31 | 显示全部楼层
本帖最后由 renxiaoyao 于 2010-4-15 23:46 编辑

抓了一下包,貌似Microsoft.XMLHTTP自动帮我把cookie也发出去,所以能抓到我要的东西
好神奇,我是在_IECreateEmbedded()创建的对象里面登陆,然后Microsoft.XMLHTTP抓取某一个页面的
哪位大大能帮我解释下吗?
发表于 2010-4-16 00:29:37 | 显示全部楼层
这个应该是父进程继承的关系吧
 楼主| 发表于 2010-4-16 00:41:15 | 显示全部楼层
本帖最后由 renxiaoyao 于 2010-4-16 00:44 编辑
这个应该是父进程继承的关系吧
maker 发表于 2010-4-16 00:29


哦,谢谢!Microsoft.XMLHTTP比较特别吗,哈

一楼问题自己迂回解决了:先Ping一下主机,不通就返回超时,通了才去抓页面
发表于 2010-4-16 00:46:03 | 显示全部楼层
哦,谢谢!Microsoft.XMLHTTP比较特别吗,哈

一楼问题自己迂回解决了:先Ping一下主机, ...
renxiaoyao 发表于 2010-4-16 00:41



    ping 最好还加个 InetGetInfo 候补…… ping通直接过,ping不通就用InetGetInfo上
 楼主| 发表于 2010-4-16 01:50:00 | 显示全部楼层
ping 最好还加个 InetGetInfo 候补…… ping通直接过,ping不通就用InetGetInfo上
afan 发表于 2010-4-16 00:46


谢谢afan大大,这样么?
Func _XmlHttp($URL, $Timeouts = 5000, $SleepTime = 1000) ;页面下载
        ;超时返回 "error",否则返回ResponseBody
        
        $Host_Test = StringRegExp($URL, "http://(.*?)/", 3)
        If Not @error Then
                $Host = $Host_Test[0]
        Else
                $Host = StringReplace($URL, "http://", "")
        EndIf ;获取主机名

        If Ping($Host, $Timeouts) <=0 Then
                $InetGet_Test = InetGet($URL, "InetGet.tmp", 1, 1)
                Sleep($SleepTime)
                If InetGetInfo($InetGet_Test, 0) = 0 Then
                        InetClose($InetGet_Test)
                        Return "error"
                Else
                        InetClose($InetGet_Test)
                        FileDelete("InetGet.tmp")
                EndIf
        EndIf ;检测是否能连上
        
        $oHTTP = ObjCreate("Microsoft.XMLHttp")
        $oHTTP.Open ( "GET" , $URL , False )
        $oHTTP.SetRequestHeader("Referer", "http://"&$Host&"/")
        $oHTTP.SetRequestHeader("Accept-Language", "zh-cn")
        $oHTTP.SetRequestHeader("Connection", "Keep-Alive");数据传递完并不立即关闭连接
        $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");表示客户端提交给服务器文本内容的编码方式
        $oHTTP.SetRequestHeader("Cache-Control", "no-cache");返回消息中的Cache用于指定网页缓存
        $oHTTP.Send ()
        $oReturnWebS = BinaryToString ( $oHTTP.ResponseBody )
        Return $oReturnWebS
        $oHTTP.Nothing
EndFunc
发表于 2010-4-16 01:54:01 | 显示全部楼层
谢谢afan大大,这样么?
renxiaoyao 发表于 2010-4-16 01:50


应该可以了
 楼主| 发表于 2010-4-16 01:55:47 | 显示全部楼层
无时不在的afan大大!

再次感谢诸位!
发表于 2010-4-16 01:59:40 | 显示全部楼层
回复 13# renxiaoyao


    呵呵~

另外,Sleep($SleepTime) 其实可以加入循环读取,因为可能50ms或更短就能结束判断了~
 楼主| 发表于 2010-4-16 02:47:11 | 显示全部楼层
本帖最后由 renxiaoyao 于 2010-4-16 02:50 编辑
回复  renxiaoyao


    呵呵~

另外,Sleep($SleepTime) 其实可以加入循环读取,因为可能50ms或更短 ...
afan 发表于 2010-4-16 01:59


afan大大是速度和精力的代名词!
Func _GetHost($URL)  ;获取主机名
        $Host_Test = StringRegExp($URL, "http://(.*?)/", 3)
        If Not @error Then
                $Host = $Host_Test[0]
        Else
                $Host = StringReplace($URL, "http://", "")
        EndIf
        Return $Host
EndFunc

Func _IsTimeout($URL, $Timeouts) ;检测是否能连上
        If Ping(_GetHost($URL), $Timeouts/2) <=0 Then
                $InetGet_Test = InetGet($URL, "InetGet.tmp", 1, 1)
                For $i = 1 To Ceiling($Timeouts/100) ;$Timeouts/2/50
                        Sleep(50)
                        If InetGetInfo($InetGet_Test, 0) > 0 Then
                                InetClose($InetGet_Test)
                                FileDelete("InetGet.tmp")
                                Return "OK"
                        EndIf
                Next
                InetClose($InetGet_Test)
                Return "error"
        EndIf
        Return "OK"
EndFunc
Func _XmlHttp($URL, $Timeouts = 5000) ;页面下载
        ;超时返回 "error",否则返回ResponseBody
       
        If _IsTimeout($URL, $Timeouts) = "error" Then
                Return "error"
        EndIf
       
        $oHTTP = ObjCreate("Microsoft.XMLHttp")
        $oHTTP.Open ( "GET" , $URL , False )
        $oHTTP.SetRequestHeader("Referer", "http://"&_GetHost($URL)&"/")
……
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-27 02:45 , Processed in 0.101849 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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