找回密码
 加入
搜索
查看: 13077|回复: 18

[网络通信] 求助网络不通时$oHTTP.send()报错的处理办法[已解决]

 火.. [复制链接]
发表于 2011-5-19 11:53:03 | 显示全部楼层 |阅读模式
本帖最后由 zysanjing1 于 2011-5-31 19:54 编辑

$oHTTP=objCreat("microsoft.xmlhttp")
$oHTTP.open("GET","url=自定义的网址",true)
$oHTTP.send("")
此时如果网络不通
$oHTTP.send()就会卡住很长时间最后报错,并使程序失去控制而被迫退出,
请问有没有办法添加延时自定义的一段时间,来判断网络连接,或者抓取错误码,然后自己处理出现的错误呢?
发表于 2011-5-19 12:28:13 | 显示全部楼层
判断网络是否通畅之后再去执行请求。
if ping() then ....
 楼主| 发表于 2011-5-19 12:31:31 | 显示全部楼层
本帖最后由 zysanjing1 于 2011-5-19 12:35 编辑

回复 2# kinghu318


    谢谢你的回复
   我试过ping命令,是这样写的吗?
    $my_mark=RunWait(@ComSpec&" /c "&"ping 61.147.108.237","",@SW_hide)


    但是这个反应太慢,每次大概要4到5秒才有返回值,如果我要连续的发送数据,每次都这么判断网络,降低很多的效率,能不能在出现错误的时候直接抓取错误,并处理呢?
发表于 2011-5-19 12:35:37 | 显示全部楼层
回复 3# zysanjing1

论坛有答案的
Global Const $NETWORK_ALIVE_LAN = 0x1
Global Const $NETWORK_ALIVE_WAN = 0x2
$x =DLLCall("sensapi.dll","int","IsNetworkAlive","str",$NETWORK_ALIVE_LAN)  
If $x[0]=1 Then  
     请求
Else
     网络不通
EndIf
 楼主| 发表于 2011-5-19 12:39:13 | 显示全部楼层
回复 4# kinghu318


    这个dll的内部运行机制是什么呢?这个貌似在外网可以正常判断,但是拿到例如某个内部网络,
例如:保险公司的私用网络,公安部门的内网等去访问内部网络的网站时,就没法做出判断了,请问需要改什么参数来实现呢
发表于 2011-5-19 12:43:25 | 显示全部楼层
回复 5# zysanjing1

内网也是可以判断的,我就是用的内网
DLLCall("sensapi.dll","int","IsNetworkAlive","str",$NETWORK_ALIVE_WAN)
试试看
 楼主| 发表于 2011-5-19 13:28:09 | 显示全部楼层
回复 6# kinghu318


    经过测试,如果电脑的网线直接被拔出,那么立刻判断出网络不通,
但是如果电脑与路由器之间连接,而路由器与外网断开连接时就无法判断,我需要的就是电脑显示连接正常而与需要的网站无法连接的判断,希望高手给我个思路,,,感激.....
 楼主| 发表于 2011-5-19 13:30:12 | 显示全部楼层
我的源码是:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global Const $NETWORK_ALIVE_LAN = 0x1
Global $oHTTP = ObjCreate("microsoft.xmlhttp")

Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 202, 174, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$LabelER = GUICtrlCreateLabel("Label1", 24, 24, 140, 33)
$Button1 = GUICtrlCreateButton("Button1", 24, 96, 145, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(100)
WEnd

Func Button1Click()
        $x = DllCall("sensapi.dll", "int", "IsNetworkAlive", "str", $NETWORK_ALIVE_LAN)
        If $x[0] = 1 Then
                $oHTTP.Open("POST", "http://10.231.49.241/baseweb/loginAction.do", True)
                $oHTTP.setRequestHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*")
                $oHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
                $oHTTP.setRequestHeader("Accept-Encoding", "gzip, deflate")
                $oHTTP.setRequestHeader("Accept-Language", "zh-cn")
                ;$oHTTP.setRequestHeader("Cookie", $PCCOOKIE)
                $oHTTP.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)")
                $oHTTP.Send("name=lywgh&password=123456&Submit= ?&version=20100529")
               
                If StringInStr($oHTTP.responseText, 'id="mainFrame"') = 0 Then
                        MsgBox(0, "错误", "用户名密码错误,请修改!")
                        Run(@ScriptName)
                        Sleep(300)
                        Exit
                Else
                        ;$PCCOOKIE = "visitname=" & $Zhanghao & ";" & "JSESSIONID=" & _getString($oHTTP.GetAllResponseHeaders(), "JSESSIONID=")
                        GUICtrlSetData($LabelER, "登录成功")
                EndIf
        Else
                GUICtrlSetData($LabelER, "网络不通。。。")
        EndIf
EndFunc   ;==>Button1Click

Func Form1Close()
        Exit
EndFunc   ;==>FormClose
发表于 2011-5-19 13:32:47 | 显示全部楼层
回复 7# zysanjing1


你直接用
$var = Ping("www.AutoItScript.com",250)
If $var Then; 还可以:  If @error = 0 Then ...
    Msgbox(0,"状态-成功","收发时间间隔:" & $var & "毫秒")
Else
    Msgbox(0,"状态-失败","错误代码:" & @error)
EndIf
试试,在漏油器与外网断开时正常吗
 楼主| 发表于 2011-5-19 13:49:31 | 显示全部楼层
本帖最后由 zysanjing1 于 2011-5-19 13:51 编辑

回复 9# kinghu318


    看起来可以用,但是还是不能完全控制错误处理
比如在执行 ping()命令的时候恰好网络正常,而执行$oTHHP.send()时候又不通了,那程序就会崩溃,不过这种几率应该很低了,
不知道AUTOIT能不能用像Throw……Catch……这样的语句抓错误,然后自行处理呢?
    最后非常感谢kinghu318的帮助,我现在就去内网测试
发表于 2011-5-19 21:46:55 | 显示全部楼层
回复 10# zysanjing1

不需要这么复杂。

注册ObjEvent就好了,详细看帮助的OBJ帮助。
发表于 2011-5-19 23:12:47 | 显示全部楼层
microsoft.xmlhttp是鸡肋,没有setTimeouts,弃之

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $OEvent = ObjEvent("AutoIt.Error", "MyErrFunc")
Global Const $NETWORK_ALIVE_LAN = 0x1
Global $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")

Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 202, 174, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$LabelER = GUICtrlCreateLabel("Label1", 24, 24, 140, 33)
$Button1 = GUICtrlCreateButton("Button1", 24, 96, 145, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(100)
WEnd

Func Button1Click()
        ;$x = DllCall("sensapi.dll", "int", "IsNetworkAlive", "str", $NETWORK_ALIVE_LAN)
        ;If $x[0] = 1 Then
        $oHTTP.Open("POST", "http://10.231.49.241/baseweb/loginAction.do", True)
        $oHTTP.setTimeouts(1000, 1000, 1000, 1000)
        $oHTTP.setRequestHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*")
        $oHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        $oHTTP.setRequestHeader("Accept-Encoding", "gzip, deflate")
        $oHTTP.setRequestHeader("Accept-Language", "zh-cn")
        ;$oHTTP.setRequestHeader("Cookie", $PCCOOKIE)
        $oHTTP.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)")
        $oHTTP.Send("name=lywgh&password=123456&Submit= ?&version=20100529")
        $oHTTP.WaitForResponse
        If @error Then
                Return MsgBox(0, "错误", "超时")
        EndIf
        If StringInStr($oHTTP.responseText, 'id="mainFrame"') = 0 Then
                MsgBox(0, "错误", "用户名密码错误,请修改!")
                Run(@ScriptName)
                Sleep(300)
                Return
        Else
                ;$PCCOOKIE = "visitname=" & $Zhanghao & ";" & "JSESSIONID=" & _getString($oHTTP.GetAllResponseHeaders(), "JSESSIONID=")
                GUICtrlSetData($LabelER, "登录成功")
        EndIf
        ; Else
        ;        GUICtrlSetData($LabelER, "网络不通。。。")
        ;EndIf
EndFunc   ;==>Button1Click

Func Form1Close()
        Exit
EndFunc   ;==>Form1Close

Func MyErrFunc()
EndFunc   ;==>MyErrFunc

评分

参与人数 1金钱 +20 收起 理由
zysanjing1 + 20

查看全部评分

 楼主| 发表于 2011-5-20 07:02:39 | 显示全部楼层
回复 12# ceoguang


    我想要的就是这种效果,十分感谢!!!
发表于 2011-5-20 09:07:09 | 显示全部楼层
回复 12# ceoguang


没想到还能设置setTimeouts,强。。收下拉。。。
发表于 2011-8-17 11:03:08 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-24 17:00 , Processed in 0.087066 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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