新建一个exe工程,在窗体中添加一个winsock控件,命名winsock1,下面是我简化的代码。Private Sub Form_Load()
    Winsock1.RemoteHost = "210.35.240.200"
    Winsock1.RemotePort = 80
    Winsock1.Connect
End SubPrivate Sub Winsock1_Connect()    Dim Cmd   As String
    Dim Url   As String    Url = "http://210.35.240.200/masterfiles/flashbook/index.htm"
    Cmd = "GET  " + Url + "  HTTP/1.0" & vbCrLf & vbCrLf
    Winsock1.SendData Cmd
    
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    
    Dim Text
    
    Winsock1.GetData Text, vbString
    MsgBox Text
    
    Winsock1.Close
    Unload Form1
End Sub现在有两个问题,问题一是接收到的内容长度只有1814至6005不等(视不同页面面言),只占网页源码的很小一部分,似乎又是和winsock收发大小限制有关。问题二是无法读取校园网以外的页面哪怕是这一小部分(本人在南昌大学,测试的一些页面都是校园网以内的IP),比如163.com,sina.com.cn。本人百思不得其解,还望有高人前来指点,重分相送。

解决方案 »

  1.   

    我对这个问题很感兴趣,但我对WINSOCK不是很熟悉?关注
      

  2.   

    我也在南昌, 收到内容不等,说明对方做了几次包发送过来,而你在winsock线程的一个检测周期中只检测到了其中几个,不全,不过没关系, 后续还会有包的,
    问题是你为什么要msgbox text后.close,又 unload呢??
    可以这样,  winsock1.getdata text,vbstring
               text1.text = text1.text & text
               end sub
    你就可以看结果拉。
    外网看不到, 无法读取是什么意思? 或者说,你connect不上, 或者是, get后没响应???
    你用ie可以看的到么? 如果ie可以看的到,看下他的包,如果一样,绝对可以
      

  3.   

    why not use xmlhttprequest?
      

  4.   

    Private Sub Form_Load()
        Winsock1.RemoteHost = "www.wave12.com"
        Winsock1.RemotePort = 80
        Winsock1.Connect
    End SubPrivate Sub Winsock1_Connect()    Dim Cmd   As String
        Dim Url   As String    Url = "http://www.wave12.com/index.asp"
        Cmd = "GET  " + Url + "  HTTP/1.0" & vbCrLf & vbCrLf
        Winsock1.SendData Cmd
        
    End Sub
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        
        Dim Text
        
         Winsock1.GetData Text, vbString
         Text1.Text = Text1.Text & Text
               
        Winsock1.Close
      
    End Sub
    以上代码现场测试成功,但有两个小问题  1、url如果不写成http://www.wave12.com/index.asp而写成http://www.wave12.com将找不到确省的网页,怎么回事?  2、关闭程序后,VB死掉
      

  5.   

    更正   URL写成 http://www.wave12.com/   可以得到缺省网页
      

  6.   

    To  flyintosky555(飞入蓝天)你能确定读出来的信息是完整的吗,你试下加这条语句
    Text1.Text = Len(Text) & vbCrLf
    我读出的text长度是4294To enhydraboy(乱舞的浮尘) 
    why not use xmlhttprequest?
    太耗资源了,任何机器都是100%cpu
    To pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
    突然有些明白为什么连不上别的网站了,因该一部分是和代理有关,在浏览器中我用了代理。比如我用http://www.google.com/intl/zh-CN/about.html做实验肯定是不行的,但是还是很多国内的站点无法正常读取,比如http://www.people.com.cn/GB/shehui/47/20030611/1014331.html,还有网易的http://news.163.com/editor/030612/030612_725735.html,再就是上面对flyintosky555(飞入蓝天)说的问题至于msgbox text后.close,又 unload 我觉的跟它们好像无关,close是个习惯问题,而且如果不close的话不能继续连接其它的站点,当然退出再进入是另一回事,upload窗体只是为了调试完后自动返回编辑状态而己,好像也没什么副作用。
      

  7.   

    我测试的页面都是用ie能够正常打开的另外   URL写成 http://www.wave12.com/   可以得到缺省网页好像还是不行的,这个倒还好理解,毕竟和浏览器不同至于说2、关闭程序后,VB死掉我倒没有遇到过,估计是你的操作系统不行了,呵呵...
      

  8.   

    找到错误!!!!   Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        
        Dim Text
        
         Winsock1.GetData Text, vbString
         Text1.Text = Text1.Text & Text
               
        'Winsock1.Close   这一句不能要
      
    End Sub  去掉Winsock1.Close 后能把数据全部读下来,而且在text1里能动态看出数据是一段一段接收的    我也听说过有些网页读不到乃防火墙所至,还有有些要使用代理服务器???我QQ:199644181
      

  9.   

    1:
    代理跟NAT是不同的~  
    代理是一种服务,工作在应用层的, 你ie是代理,所以你get xx时, ie会给你转
    代理协议,比如socket5, 给代理服务器, 然后代理服务器发送请求,结果给你
    所以你跳过这一转代理协议这一步是不行的
    NAT是一种映射, 工作在会话层的,当你get的xx的时候, 系统会帮你直接把包发送给
    你的网关, 然后你的网关进行端口映射,把结果给你,对程序来说是透明的
    也就是你的winsock不要改, ie不要改设置, 因为他们根本不知道NAT的存在,只有系统知道2:
    close是个习惯问题,而且如果不close的话不能继续连接其它的站点,
    当然close是个好习惯,不过这个close是应该发生在connect之前,而不是在收到数据
    的时候 比如
       with winsock1
             .close
             .remotehost = xxx
             .remoteport = xxx
             .connect
       end with
    一个winsock收到数据,并不能证明他收到了完整数据, 这里就需要你判断了, 比如
    以收到</html>做标记, 或者设定超时, 也就是说:对方发送的数据,可能分了几个包,
    因为一个web也面内容可能大, 而一般的MTU只有1500byte, 而且tcp也会分包处理,
    每个包之间会有研时, 当然winsock不知道,他做的只是定期检测,发现有数据, 就给你一个
    事件,由于不可预测的时间差,当然收到的字节数是不确定,不过你等等, 他还会给你事件的
    ,当后续包到达的时候. 把每个事件收到的字符串连接起来,就是完整内容
      

  10.   

    pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) “一个winsock收到数据,并不能证明他收到了完整数据”此话说的极是,真是茅“厕”顿开!
      

  11.   

    那么一些无法正常读取的网页又该怎么解决呢,也就是所说的代理或NAT问题,
    下面代码无法正常读取http://www.people.com.cn/GB/shehui/47/20030611/1014331.html这个页面Private Sub Form_Load()
        winsock1.RemoteHost = "www.people.com.cn"
        winsock1.RemotePort = 80
        winsock1.Connect
    End SubPrivate Sub Winsock1_Connect()    Dim Cmd   As String
        Dim Url   As String    Url = "http://www.people.com.cn/GB/shehui/47/20030611/1014331.html"
        Cmd = "GET  " + Url + "  HTTP/1.0" & vbCrLf & vbCrLf
        winsock1.SendData Cmd
        
    End Sub
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        
        Dim Text
        
         winsock1.GetData Text, vbString
         Text1.Text = Text1.Text & Text
         
    End Sub
      

  12.   

    没有办法Private Sub Winsock1_Connect()    Dim Cmd   As String
        Dim Url   As String    Url = "http://www.people.com.cn/GB/shehui/47/20030611/1014331.html"
        Cmd = "GET  " + Url + "  HTTP/1.0" & vbCrLf & vbCrLf
        winsock1.SendData Cmd
        
    End Sub根本就不会执行你应该 connect 你的 代理服务器, 然后发送socket5协议,而不是http协议,让他来转换
      

  13.   

    还是有执行的,反馈的信息是HTTP/1.1 500 Proxy Error
    Date: Thu, 12 Jun 2003 07:09:28 GMT
    Connection: close
    Content-Type: text/html; charset=iso-8859-1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>500 Proxy Error</TITLE>
    </HEAD><BODY>
    <H1>Proxy Error</H1>
    The proxy server could not handle the request <EM><A HREF="http://www.people.com.cn/GB/shehui/47/20030611/1014331.html">GET&nbsp;http://www.people.com.cn/GB/shehui/47/20030611/1014331.html</A></EM>.<P>
    Reason: <STRONG>Host not found</STRONG><P>
    <HR>
    <ADDRESS>Apache/1.3.27 Server at web Port 80</ADDRESS>
    </BODY></HTML>想不到你还在线,不如直接用QQ连系吧,我的是1354686
      

  14.   

    我的qq 900572 不过现在不可以开,我在上班, 开开网页还可以
    看的到,你给你的信息其实是 代理服务器给你的
    你肯定很奇怪,为什么代理服务器会给你? 他怎么知道你请求了? 呵呵
    看下你的tcp/ip的设置, 是不是有网关?? 就是他了~
    你请求一个ip的时候,你是直接连不同的,系统当然知道,他发现你社了网关,
    就会把请求给网关, 网关刚好是代理服务器,当然也开了80端口, 就开始代理起来拉
    不过你给他的内容就不正确拉(不是代理协议内容), 他不可以识别, 就
    反馈:HTTP/1.1 500 Proxy Error PS: 我天天要路过你们学校, 是不是要请我吃吨饭 :)