如何实现类似断点续传的问题,高分求解,来者有分,送完为止!

3gw 2006-10-25 10:18:53
这个问题有点类似断点续传。

网站上有一个文本文件a.txt,它在一天内随着时间的变化,而文件内容不断被添加数据而变大了,最大会有1M左右。但是我只想快速获取它的最后20行数据(而不用这种笨方法:先下载整个文本文件,再读取最后20行),请问如何是好?诚心求解,万分感谢!
...全文
403 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyehanxinlei 2006-11-07
  • 打赏
  • 举报
回复
学习支持
zhuanzhu_zhizhuo 2006-11-04
  • 打赏
  • 举报
回复
up
3gw 2006-11-03
  • 打赏
  • 举报
回复
up
3gw 2006-11-01
  • 打赏
  • 举报
回复
up
gsfcstx16 2006-10-27
  • 打赏
  • 举报
回复
学习
happy_sea 2006-10-26
  • 打赏
  • 举报
回复
至于要提交怎样的请求信息,可以自己亲自体验一下,用到两个软件:sniffer pro和讯雷(或其他任何一款支持断点续传的下载软件),方法如下:用讯雷下载该服务器上的一个文件,下载到一定程度时暂停,启动sniffer pro开始拦截,用讯雷继续下载,sniffer pro结束拦截然后看看讯雷发出的请求信息就行了。
3gw 2006-10-26
  • 打赏
  • 举报
回复
高手都不在吗?
3gw 2006-10-26
  • 打赏
  • 举报
回复
up如下面的代码,无法断点取,而如果把str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"改成str1 = "GET / HTTP/1.0"则可以断点取,为何?



'Option Explicit
Dim strCommand As String
Dim strWebPage As String
Dim FileSize As Integer

Private Sub Command1_Click()

Winsock1.RemoteHost = "www.relaxsoft.net" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。


End Sub

Private 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 str1

End Sub

Private 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

Eddie005 2006-10-26
  • 打赏
  • 举报
回复
jf~
3gw 2006-10-26
  • 打赏
  • 举报
回复
请问是不是没有固定的文件,象这种格式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"则可以把主页文件断点取来。难道没有好办法吗?
happy_sea 2006-10-25
  • 打赏
  • 举报
回复
关键是你能否确定从第多少字节开始下载,如果确定了这一点,用winsock发一个类似这样的文件头过去等着接收就行了:
"GET /a.txt HTTP/1.1"
"Host: 12.34.56.78"
"Referer: http://12.34.56.78/remotedir" '//下载文件的URL位置
"Range: bytes=1234-" '//文件的开始下载位置是1234
3gw 2006-10-25
  • 打赏
  • 举报
回复
a.txt每隔等1分钟加一次数据进去。
后20行大小基本不变,变的话,也会在几个字符之内。
有没有详细一点的代码,请指教。
zq972 2006-10-25
  • 打赏
  • 举报
回复
学习
VBToy 2006-10-25
  • 打赏
  • 举报
回复
在http协议中断点续传是根据Header中的Range域实现的,Range域中的数值是要下载文件的范围。如果你的文本文件在20行之前的数据大小是不定的,恐怕用http协议准确获得最后20行是不可能实现的。
如果后20行的数据大小是确定的,可以取得文件的大小后计算Range的值。
或者估计一下后20行的大小,用Range取出后部分文件。
3gw 2006-10-25
  • 打赏
  • 举报
回复
Dim strCommand As String
Dim strWebPage As String
Dim FileSize As Integer

Private Sub Command1_Click()

Winsock1.RemoteHost = "100.0.1.1" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。


End Sub

Private Sub Winsock1_Close()

End Sub

Private 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 '记住一定要加上vbCrLf

Debug.Print strCommand

Winsock1.SendData strCommand ''给远程计算机发送数据

End Sub

Private 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,再重新指定下载位置,再下载呀,还需要补充些什么代码。谢谢
迈克揉索芙特 2006-10-25
  • 打赏
  • 举报
回复
在网站上用ASP写个服务,用来读取txt并返回指定的文本。客户端调用这个asp。
cangwu_lee 2006-10-25
  • 打赏
  • 举报
回复
不能指定行数,能指定字节范围。这样应该很明白的了。

做法像楼上讲的。

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧