如何实现类似断点续传的问题,高分求解,来者有分,送完为止! 这个问题有点类似断点续传。网站上有一个文本文件a.txt,它在一天内随着时间的变化,而文件内容不断被添加数据而变大了,最大会有1M左右。但是我只想快速获取它的最后20行数据(而不用这种笨方法:先下载整个文本文件,再读取最后20行),请问如何是好?诚心求解,万分感谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在http协议中断点续传是根据Header中的Range域实现的,Range域中的数值是要下载文件的范围。如果你的文本文件在20行之前的数据大小是不定的,恐怕用http协议准确获得最后20行是不可能实现的。如果后20行的数据大小是确定的,可以取得文件的大小后计算Range的值。或者估计一下后20行的大小,用Range取出后部分文件。 a.txt每隔等1分钟加一次数据进去。后20行大小基本不变,变的话,也会在几个字符之内。有没有详细一点的代码,请指教。 关键是你能否确定从第多少字节开始下载,如果确定了这一点,用winsock发一个类似这样的文件头过去等着接收就行了:"GET /a.txt HTTP/1.1" "Host: 12.34.56.78" "Referer: http://12.34.56.78/remotedir" '//下载文件的URL位置"Range: bytes=1234-" '//文件的开始下载位置是1234 在网站上用ASP写个服务,用来读取txt并返回指定的文本。客户端调用这个asp。 Dim strCommand As StringDim strWebPage As StringDim FileSize As IntegerPrivate Sub Command1_Click()Winsock1.RemoteHost = "100.0.1.1" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号Winsock1.Connect '返回与远程计算机的连接。End SubPrivate Sub Winsock1_Close()End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。On Error Resume NextstrWebPage = "/a.txt"strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要strCommand = strCommand + "Referer: http://100.0.1.1/" + vbCrLf '这句可以不要strCommand = strCommand + "RANGE: bytes=200070-" + vbCrLf '这句可以不要'strCommand = strCommand + "Range: bytes=303081-" + vbCrLf '这句可以不要strCommand = strCommand + vbCrLf '记住一定要加上vbCrLfDebug.Print strCommandWinsock1.SendData strCommand ''给远程计算机发送数据End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件On Error Resume Next '在错误处理程序结束后,恢复原有的运行Dim webData As StringWinsock1.GetData webData, vbString '检取当前的数据块 If InStr(1, webData, "Content-Length:") > 0 And FileSize = 0 Then '仅第一次计算,FileSize=0 Dim pos1 As Long, pos2 As Long pos1 = InStr(1, webData, "Content-Length:") pos2 = InStr(pos1 + 16, webData, vbCrLf) If pos2 > pos1 Then filesizebyte = Mid(webData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长 MsgBox filesizebyte'成功取得文件长度 End If End If上面的代码,我成功取得了文件长度,是不是先关掉winsock,再重新指定下载位置,再下载呀,还需要补充些什么代码。谢谢 up如下面的代码,无法断点取,而如果把str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"改成str1 = "GET / HTTP/1.0"则可以断点取,为何?'Option ExplicitDim strCommand As StringDim strWebPage As StringDim FileSize As IntegerPrivate Sub Command1_Click()Winsock1.RemoteHost = "www.relaxsoft.net" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号Winsock1.Connect '返回与远程计算机的连接。End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。On Error Resume Next'strWebPage = "/"'strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令'strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要'strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要'strCommand = strCommand + "Referer: http://218.90.212.30/" + vbCrLf '这句可以不要'strCommand = strCommand + "RANGE: bytes=200070-" + vbCrLf '这句可以不要'strCommand = strCommand + "Range: bytes=303081-" + vbCrLf '这句可以不要'strCommand = strCommand + vbCrLf '记住一定要加上vbCrLf'Debug.Print strCommand'Winsock1.SendData strCommand ''给远程计算机发送数据 str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0" & vbCrLf & _ "Host: www.relaxsoft.net" & vbCrLf & _ "Accept: */*" & vbCrLf & _ "User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)" & vbCrLf & _ "Referer: http://www.relaxsoft.net/soonweb/new/read.asp?id=172" & vbCrLf & _ "Range: bytes=366-" & vbCrLf & _ "Pragma: no-cache" & vbCrLf & _ "Cache-Control: no-cache" & vbCrLf & _ "Connection: close" & vbCrLf & vbCrLfWinsock1.SendData str1Debug.Print str1End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件On Error Resume Next '在错误处理程序结束后,恢复原有的运行Dim webData As StringWinsock1.GetData webData, vbString '检取当前的数据块 If InStr(1, webData, "Content-Length:") > 0 And FileSize = 0 Then '仅第一次计算,FileSize=0 Dim pos1 As Long, pos2 As Long pos1 = InStr(1, webData, "Content-Length:") pos2 = InStr(pos1 + 16, webData, vbCrLf) If pos2 > pos1 Then filesizebyte = Mid(webData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长 MsgBox filesizebyte 'Winsock1.Close 'Winsock1.RemoteHost = "218.90.212.30" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。'Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号'Winsock1.Connect '返回与远程计算机的连接。 'Winsock1.SendData "Range: bytes=303081-" End If End If Text1.Text = Text1.Text + webDataEnd Sub 至于要提交怎样的请求信息,可以自己亲自体验一下,用到两个软件:sniffer pro和讯雷(或其他任何一款支持断点续传的下载软件),方法如下:用讯雷下载该服务器上的一个文件,下载到一定程度时暂停,启动sniffer pro开始拦截,用讯雷继续下载,sniffer pro结束拦截然后看看讯雷发出的请求信息就行了。 请问是不是没有固定的文件,象这种格式str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"就不能实现类似的断点取了?是不是可以当数据到来时,假装已接收,发什么消息过去,让它接着传数据过来,最后只接收真正想要的数据?如上面的代码,无法断点取,而如果把str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"改成str1 = "GET / HTTP/1.0"则可以把主页文件断点取来。难道没有好办法吗? 请教VB+SQl Server实现单机离线数据库的好方法 高兴,散分!! 怎么给datagrid控件加上下,左右的滚动条呢 为了实现将DATAGRID中的数据装入EXCEL,出了个小问题。帮帮我 如何实现局域网内文件复制? treeview问题 大虾们,难道MSChart这个控件真的很难用吗? 电费暴高,求秘方~ VB版的各位朋友,现在做一个多媒体教学软件用什么工具好 VB访问SQL2000数据库的问题,拜谢了 波特率的问题 急!关于打印机端口问题
如果后20行的数据大小是确定的,可以取得文件的大小后计算Range的值。
或者估计一下后20行的大小,用Range取出后部分文件。
后20行大小基本不变,变的话,也会在几个字符之内。
有没有详细一点的代码,请指教。
"GET /a.txt HTTP/1.1"
"Host: 12.34.56.78"
"Referer: http://12.34.56.78/remotedir" '//下载文件的URL位置
"Range: bytes=1234-" '//文件的开始下载位置是1234
Dim strWebPage As String
Dim FileSize As IntegerPrivate Sub Command1_Click()Winsock1.RemoteHost = "100.0.1.1" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。
End SubPrivate Sub Winsock1_Close()End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。
On Error Resume Next
strWebPage = "/a.txt"
strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令
strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要
strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
strCommand = strCommand + "Referer: http://100.0.1.1/" + vbCrLf '这句可以不要
strCommand = strCommand + "RANGE: bytes=200070-" + vbCrLf '这句可以不要
'strCommand = strCommand + "Range: bytes=303081-" + vbCrLf '这句可以不要
strCommand = strCommand + vbCrLf '记住一定要加上vbCrLfDebug.Print strCommandWinsock1.SendData strCommand ''给远程计算机发送数据End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件
On Error Resume Next '在错误处理程序结束后,恢复原有的运行
Dim webData As String
Winsock1.GetData webData, vbString '检取当前的数据块 If InStr(1, webData, "Content-Length:") > 0 And FileSize = 0 Then '仅第一次计算,FileSize=0
Dim pos1 As Long, pos2 As Long
pos1 = InStr(1, webData, "Content-Length:")
pos2 = InStr(pos1 + 16, webData, vbCrLf)
If pos2 > pos1 Then
filesizebyte = Mid(webData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长
MsgBox filesizebyte'成功取得文件长度
End If
End If
上面的代码,我成功取得了文件长度,是不是先关掉winsock,再重新指定下载位置,再下载呀,还需要补充些什么代码。谢谢
Dim strCommand As String
Dim strWebPage As String
Dim FileSize As IntegerPrivate Sub Command1_Click()Winsock1.RemoteHost = "www.relaxsoft.net" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。
End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。
On Error Resume Next
'strWebPage = "/"
'strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令
'strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要
'strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
'strCommand = strCommand + "Referer: http://218.90.212.30/" + vbCrLf '这句可以不要
'strCommand = strCommand + "RANGE: bytes=200070-" + vbCrLf '这句可以不要
'strCommand = strCommand + "Range: bytes=303081-" + vbCrLf '这句可以不要
'strCommand = strCommand + vbCrLf '记住一定要加上vbCrLf'Debug.Print strCommand'Winsock1.SendData strCommand ''给远程计算机发送数据 str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0" & vbCrLf & _
"Host: www.relaxsoft.net" & vbCrLf & _
"Accept: */*" & vbCrLf & _
"User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)" & vbCrLf & _
"Referer: http://www.relaxsoft.net/soonweb/new/read.asp?id=172" & vbCrLf & _
"Range: bytes=366-" & vbCrLf & _
"Pragma: no-cache" & vbCrLf & _
"Cache-Control: no-cache" & vbCrLf & _
"Connection: close" & vbCrLf & vbCrLf
Winsock1.SendData str1
Debug.Print str1End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件
On Error Resume Next '在错误处理程序结束后,恢复原有的运行
Dim webData As String
Winsock1.GetData webData, vbString '检取当前的数据块 If InStr(1, webData, "Content-Length:") > 0 And FileSize = 0 Then '仅第一次计算,FileSize=0
Dim pos1 As Long, pos2 As Long
pos1 = InStr(1, webData, "Content-Length:")
pos2 = InStr(pos1 + 16, webData, vbCrLf)
If pos2 > pos1 Then
filesizebyte = Mid(webData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长
MsgBox filesizebyte
'Winsock1.Close
'Winsock1.RemoteHost = "218.90.212.30" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
'Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
'Winsock1.Connect '返回与远程计算机的连接。
'Winsock1.SendData "Range: bytes=303081-"
End If
End If
Text1.Text = Text1.Text + webData
End Sub