新建一个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。本人百思不得其解,还望有高人前来指点,重分相送。
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。本人百思不得其解,还望有高人前来指点,重分相送。
问题是你为什么要msgbox text后.close,又 unload呢??
可以这样, winsock1.getdata text,vbstring
text1.text = text1.text & text
end sub
你就可以看结果拉。
外网看不到, 无法读取是什么意思? 或者说,你connect不上, 或者是, get后没响应???
你用ie可以看的到么? 如果ie可以看的到,看下他的包,如果一样,绝对可以
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死掉
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窗体只是为了调试完后自动返回编辑状态而己,好像也没什么副作用。
Dim Text
Winsock1.GetData Text, vbString
Text1.Text = Text1.Text & Text
'Winsock1.Close 这一句不能要
End Sub 去掉Winsock1.Close 后能把数据全部读下来,而且在text1里能动态看出数据是一段一段接收的 我也听说过有些网页读不到乃防火墙所至,还有有些要使用代理服务器???我QQ:199644181
代理跟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不知道,他做的只是定期检测,发现有数据, 就给你一个
事件,由于不可预测的时间差,当然收到的字节数是不确定,不过你等等, 他还会给你事件的
,当后续包到达的时候. 把每个事件收到的字符串连接起来,就是完整内容
下面代码无法正常读取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
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协议,让他来转换
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 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
看的到,你给你的信息其实是 代理服务器给你的
你肯定很奇怪,为什么代理服务器会给你? 他怎么知道你请求了? 呵呵
看下你的tcp/ip的设置, 是不是有网关?? 就是他了~
你请求一个ip的时候,你是直接连不同的,系统当然知道,他发现你社了网关,
就会把请求给网关, 网关刚好是代理服务器,当然也开了80端口, 就开始代理起来拉
不过你给他的内容就不正确拉(不是代理协议内容), 他不可以识别, 就
反馈:HTTP/1.1 500 Proxy Error PS: 我天天要路过你们学校, 是不是要请我吃吨饭 :)