文件传输的难题,请高手解答(附著名的源码)

hcs 2002-11-21 05:39:06
在文件传输时,文件小于4K的情况下,一切正常。但文件大于4K时,有时传输98%,有时传输97%,还有时只传输80%。我快疯了,帮帮我吧!(这是很著名的源代码,很多书上有关文件传输的内容都使用这段代码)


'发送
Private Sub sckSystem_DataArrival(ByVal bytesTotal As Long)
blockSize = 4096
Dim tempComData As String
sckSystem.GetData tempComData, vbString

Dim Command As String
Command = Mid(tempComData, 1, 1)

'MsgBox command
If Command = CANCEL_TRANSFER Then
stopSending
End If

If Command = ENABLE_START Then Command1.Enabled = True

If Command = ACCEPT_TRANSFER Then
DoEvents
sckSend.Connect
Do Until sckSend.State = sckConnected ' Wait until connected
DoEvents
Loop
GoTo BeginTransfer
End If

If Command = CONTINUE_TRANSFER Then
'On Error GoTo ErrorHandler


' Adjust blocksize at end so we don't read too much data
If fileLength - Loc(hIn) <= blockSize Then
blockSize = fileLength - Loc(hIn) + 1
End If
Temp = Space$(blockSize) '// Allocate the read buffer
Get hIn, , Temp '// Read a block of data
ret = DoEvents() '// Check for cancel button event etc.
If quitNow Then GoTo endIt
sckSend.SendData Temp '// Off it goes

'update progress bar
sizeOfFileSent = sizeOfFileSent + blockSize
'On Error GoTo endIt '//
On Error Resume Next
ProgressBar1.value = sizeOfFileSent
compLabel.Caption = sizeOfFileSent & " of " & sizeOfFile & " sent. " & Int(sizeOfFileSent / sizeOfFile * 100) & "%"
DoEvents

If sizeOfFileSent >= sizeOfFile Then
cancel.Caption = "Close"
sckSystem.SendData CLOSE_TRANSFER
End If
Exit Sub
End If
If Command = CLOSE_TRANSFER Then GoTo endIt
Exit Sub
BeginTransfer:
'On Error GoTo ErrorHandler
hIn = FreeFile
Open pathToFile For Binary Access Read As hIn
fileLength = LOF(hIn)
' Adjust blocksize at end so we don't read too much data
If fileLength - Loc(hIn) <= blockSize Then
blockSize = fileLength - Loc(hIn) '+ 1
End If
Temp = Space$(blockSize) '// Allocate the read buffer
Get hIn, , Temp '// Read a block of data
ret = DoEvents() '// Check for cancel button event etc.
If quitNow Then GoTo endIt
sckSend.SendData Temp '// Off it goes

'update progress bar
sizeOfFileSent = sizeOfFileSent + blockSize
'On Error GoTo endIt '//
ProgressBar1.value = sizeOfFileSent
compLabel.Caption = sizeOfFileSent & " of " & sizeOfFile & " sent. " & Int(sizeOfFileSent / sizeOfFile * 100) & "%"
If sizeOfFileSent >= sizeOfFile Then
cancel.Caption = "Close"
sckSystem.SendData CLOSE_TRANSFER
End If
Exit Sub
ErrorHandler: '// Always close the file handle
Close hIn
'SendFile = False
endIt:
'cancel.Caption = "Close"
sckSend.Close 'this severes the data connection, causing the client to save/end the file
Close hIn
MsgBox "Transfer Complete"
Unload Me
End Sub



'接收
Private Sub sckReceive_DataArrival(ByVal bytesTotal As Long)

'On Error GoTo ErrorHandler

Dim TempFileData As String
sckReceive.GetData TempFileData
Put #fileNum, , TempFileData
fileLength = LOF(fileNum)

'update progress bar
'sizeOfFileSent = sizeOfFileSent + bytesTotal
sizeOfFileSent = LOF(fileNum)
On Error GoTo endIt
ProgressBar1.value = sizeOfFileSent
compLabel.Caption = sizeOfFileSent & " of " & sizeOfFile & " sent. " & Int(sizeOfFileSent / sizeOfFile * 100) & "%"

sckSystem.SendData CONTINUE_TRANSFER
DoEvents

Exit Sub

ErrorHandler:
MsgBox "An error occured while saving " & CommonDialog1.FileTitle & ". File Transfer being canceled.", vbOKOnly, "IO Error"
cancel_Click
endIt:
End Sub


...全文
43 点赞 收藏 25
写回复
25 条回复
hcs 2002年11月28日
非常感谢各位的支持,经过几天的努力,我终于明白,这些代码是针对文本文件的,如果要用在其他类型的文件传输,肯定是要出错的。现在结贴,再次谢谢各位的支持。
回复 点赞
hcs 2002年11月27日
请问传输文本文件和传输其他文件(如DOC,XLS,EXE等等),有什么不同吗?
因为这一段文件传输程序,在传输文本文件时是正常的,但传输其他文件时总是不正常!向各位请教!
回复 点赞
bluecc 2002年11月25日
不好意思,没看清楚,我说的progressbar的value不对,是因为我的程序里用progressbar的value来控制读入位置,也就是当分包时,用来判断从哪开始分包,因为我觉得你的程序里没有写清楚每个分包从哪开始分,在接收时,没写清楚封装怎么接,因此我觉得PUT函数应该有个参数要指定从哪开始写入数据.
或者你的文件打开方式有错误
回复 点赞
bluecc 2002年11月25日
可能是你在接收的时候PROFRESSBAR的VALUE有问题,因为你在赋值的时候跳过了.这个问题我也发生过,死活查不出原因,你试试
回复 点赞
GetWindowPos 2002年11月22日
是不是代码里限制了文件的传送容量,自己改改一些变量什么的试试啊
回复 点赞
hcs 2002年11月22日
回litsnake1(litsnake) :




文件差异我也看过,每次都不一样,让我困惑不已。
回复 点赞
三楼の郎 2002年11月22日
blocksize=4096

' Adjust blocksize at end so we don't read too much data

blocksize设置了单个数据包的大小,当文件大小超过设置时,会分成多个数据包来发送。
回复 点赞
litsnake1 2002年11月22日
不要看,百分之多少,你看看,传输完后的文件大小差异,文件大小差几个字节。。。
回复 点赞
hcs 2002年11月22日
我试了很入,不行!我才上这里求救各位高手。
回复 点赞
litsnake1 2002年11月22日
自己单步调试一下,看看那里出问题了
回复 点赞
Sean918 2002年11月22日
难道著名的源代码还不如我自己随便写的代码?
回复 点赞
jamesfay 2002年11月22日
'发送方
Dim FileArray() As Byte
Open "FileName" For Binary As #1
ReDim FileArray(LOF(1))
Get #1, , FileArray()
Winsock1.SendData FileArray
Close #1

'接受方
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim FileArray() As Byte
Static TotalLen As Integer
'#1 is a open file
Put #1, , FileArray
TotalLen = TotalLen + bytesTotal
If TotalLen >= FileLen Then Close #1
End Sub
回复 点赞
zyh9188 2002年11月22日
up
回复 点赞
GetWindowPos 2002年11月22日
我也有一个发送文件的程序,但是我朋友的,所以没有代码,速度比QQ的快,也不会有什么限制的,还能发送消息。要的话可以留下邮箱
回复 点赞
hcs 2002年11月22日
没有高手了吗?
回复 点赞
hcs 2002年11月22日
8k我也试了,也不行。各位兄弟,出出主意吧。
回复 点赞
holydiablo 2002年11月22日
怎么会是4K,数据包的最大传输量是8K啊,是发送的问题吧
回复 点赞
hcs 2002年11月22日
我试了,不行!
回复 点赞
hcs 2002年11月22日
回kuyu2020T(理想)


真的吗?能否把你的程序给我一份?

我的邮件是:

jqsoft@163.com


回复 点赞
zither 2002年11月22日
GZ
回复 点赞
发动态
发帖子
VB基础类
创建于2007-09-28

2748

社区成员

19.7w+

社区内容

VB 基础类
社区公告
暂无公告