Dim Times, LastBytes Dim DataLength As Long Dim i As Long
If Request.iStartPos = "" Then Request.iStartPos = 0 Request.iStartPos = CLng(Request.iStartPos)
'获取文件长度
DataLength = FileLen(szFullPath) '计算发送次数 Times = Int((DataLength - Request.iStartPos) / mBufferSize) LastBytes = (DataLength - Request.iStartPos) Mod mBufferSize
'定义缓冲
Dim szDatas() As Byte Dim szData() As Byte ReDim szDatas(mBufferSize) As Byte ReDim szData(LastBytes) As Byte
'获取文件类型 szTemp = Request.szTarget If InStr(szTemp, ".") Then Dim szType As String For i = Len(szTemp) To 1 Step -1 If Mid(szTemp, i, 1) = "." Then Exit For szType = Mid(szTemp, i, 1) & szType Next End If szType = GetMIMEByExt(szType)
'打开文件 Open szFullPath For Binary As FreeHandle Seek FreeHandle, Request.iStartPos + 1 For i = 1 To Times Get FreeHandle, , szDatas() frmMain.Socket(Index).SendData szDatas() DoEvents Next
Get FreeHandle, , szData() frmMain.Socket(Index).SendData szData() DoEvents Close FreeHandle DoEvents
要实现FTP的断点续传,FTP服务器必须支持REST指令,这条指令在FTP协议文本RFC959中就已经定义了,不过它不是FTP服务器必须支持的指令。一般,你可以在下载前使用REST 100命令进行实验,如果服务器正常执行了这条命令,说明该服务器支持FTP断点续传。REST后面跟的数表示下载文件的起始位置,而REST 0表示从文件最开始处下载。REST命令本身并不执行下载功能,你仍需要使用RETR命令执行下载工作。
要实现HTTP断点续传,Web服务器必须支持HTTP/1.1(协议文本为RFC2068),当然也不是所有支持HTTP/1.1的服务器都实现了HTTP断点续传。一般在正常的Header之外,还要在Header中加上如下几句:
Connection: close
Host: www.host.com
Range: bytes=1-100
这里的Range就是指定下载范围,也可以使用"100-"表示从100开始下载。更详细的内容可以参见RFC2068。
上面介绍的是原理,现在一般编程都使用各种控件,所以实现的时候应该具体分析。绝大多数HTTP控件都允许用户修改HTTP的Header,所以HTTP的续传比较容易实现。有的FTP控件不支持REST命令,也有控件通过特殊的属性来实现REST命令,如IP*Works!就使用StartByte属性来实现REST的功能。
VB本身包括的Internet Transfer Control不能实现FTP的断点传续,因为不支持REST命令,但执行Execute 方法时利用requestHeaders参数可以实现HTTP的断点传续
但是通过协议可以实现
比如FTP
似乎我讨论的问题 这里没人能回答吗? 还是高手觉得这太简单了?
这里主要针对p2p软件的技术讨论
给你看看我写的断点续传WebServer的相关代码
'打开文件
Dim Times, LastBytes
Dim DataLength As Long
Dim i As Long
If Request.iStartPos = "" Then Request.iStartPos = 0
Request.iStartPos = CLng(Request.iStartPos)
'获取文件长度
DataLength = FileLen(szFullPath)
'计算发送次数
Times = Int((DataLength - Request.iStartPos) / mBufferSize)
LastBytes = (DataLength - Request.iStartPos) Mod mBufferSize
'定义缓冲
Dim szDatas() As Byte
Dim szData() As Byte
ReDim szDatas(mBufferSize) As Byte
ReDim szData(LastBytes) As Byte
'获取文件类型
szTemp = Request.szTarget
If InStr(szTemp, ".") Then
Dim szType As String
For i = Len(szTemp) To 1 Step -1
If Mid(szTemp, i, 1) = "." Then Exit For
szType = Mid(szTemp, i, 1) & szType
Next
End If
szType = GetMIMEByExt(szType)
If Not Request.iStartPos = 1 Then
HttpHead = "HTTP/1.1 206 Partial content" & vbCrLf
HttpHead = HttpHead & "Server: " & mServer.ServerName & vbCrLf
HttpHead = HttpHead & "Connection: close" & vbCrLf
HttpHead = HttpHead & "Content-Type: " & szType & vbCrLf
HttpHead = HttpHead & "Content-Length: " & DataLength - Request.iStartPos & vbCrLf
HttpHead = HttpHead & "Content-Range: bytes " & Request.iStartPos & "-" & DataLength - 1 & "/" & DataLength & vbCrLf
HttpHead = HttpHead & vbCrLf
Else
HttpHead = "HTTP/1.1 200 OK" & vbCrLf
HttpHead = HttpHead & "Server: " & mServer.ServerName & vbCrLf
HttpHead = HttpHead & "Accept-Ranges: bytes" & vbCrLf
HttpHead = HttpHead & "Connection: close" & vbCrLf
HttpHead = HttpHead & "Content-Type: " & szType & vbCrLf
HttpHead = HttpHead & "Content-Length: " & DataLength & vbCrLf
HttpHead = HttpHead & vbCrLf
End If
'发送HTTP头
frmMain.Socket(Index).SendData HttpHead
DoEvents
'打开文件
Open szFullPath For Binary As FreeHandle
Seek FreeHandle, Request.iStartPos + 1
For i = 1 To Times
Get FreeHandle, , szDatas()
frmMain.Socket(Index).SendData szDatas()
DoEvents
Next
Get FreeHandle, , szData()
frmMain.Socket(Index).SendData szData()
DoEvents
Close FreeHandle
DoEvents
线程一下载: 1-200K
线程二下载: 201-400K
线程三下载: 401-600K
线程四下载: 601-800K
线程五下载: 801-1000K用Winsock控件数组, 你可以用 Winsock(0) 来监听,然后每接收到一个连接请求分配一个空闲的Winsock给他连接上,然后每个Winsock有独立的事件驱动工作,相当于并行工作。
还有个问题就是p2p的传输 用udp还是tcp好些啊?
如果你要拆分,那就有这样的问题:如果是大文件,拆出来就占用了硬盘空间..况且VB的效率..
如果拆成小文件,那就要拆很多个,一个100M的如果1M一个要拆100个,如果拆5M一个也可,不过那断点续传该称为"断段续传"
程序员要求
熟悉VB的socket通讯、数据库(任意)
联系方式
[email protected]
13301116100李先生
ok 结贴了 谢谢大家参加讨论