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

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


...全文
126 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
加载更多回复(5)

7,762

社区成员

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

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