VB实现局域⽹内的⽂件传输
为了设计统⼀和⽤户操作⽅便,我们希望将服务端与客户端融合在⼀起,形成⼀个程序,这样⽤户理解起来,更加直观⼀点(其实这
样做也是为了⽅便调试,⼤家可以在本机上测试,⾃⼰传⽂件给⾃⼰)。所以,我们在程序中需要使⽤两个Winsock控件,⼀个负责监
听,⼀个负责发送,当发送端连接成功以后,便选择⼀个待发送的⽂件(可以是任意⼆进制⽂件),接着将⽂件名和⽂件字节长度发送
给接收端,接收端收到这个消息以后,将⽂件名和⽂件长度解析出来,然后通知发送端可以开始发送⽂件;发送端读到这个消息之后,
将⽂件流以字节的形式发送到接收端,接收端收到后,将⼆进制流回写,保存成⽂件即可。这⾥要注意两点,⼀个是由于Winsock每次
最⼤传输8K的内容,所以需要将⽂件分解,每次传输固定数⽬的字节流,这样发送和接收时都可以根据这个数⽬来判断⽂件传输的进
程,⼀旦字节流数⽬等于⽂件的⼤⼩,就需要关闭相应的⽂件句柄;另⼀点是由于我只使⽤⼀个Winsock控件接收,接收⽂本时需要注
意要将UNICODE转码,解析成可识别的信息。
源代码
'下⾯的代码既是服务器⼜是客户端
'采⽤应答式发送⽅式
'⾃动拆分⽂件,包括2进制
OptionEXPlicit
'PrivateDeclareSubSleepLib"kernel32"(ByValdwMillicondsAsLong)
Dimmybyte()AsByte'发送⽅数组
ConstfilecomesMSG="afileiscoming"'有⽂件到来
ConstRemoteIsReadyMSG="nderisready"'准备好了
ConstFileisOverMSG="thefileinded"'⽂件完毕
ConstRemoteDenyMSG="theurcanceled"'⽤户取消
ConstfilecountMSG="thefilelenghis"'⽂件长度
ConstRecevieIsReadyMSG="Receiverisready"'准备接收
Dimarrdata()AsByte'收到的信息
DimfilesaveAsInteger'保存⽂件的句柄
DimfilehandleAsInteger'发送⽅⽂件的句柄
DimFileSizeAsDouble'⽂件的⼤⼩
DimSendbyteAsLong
DimReceivebyteAsLong
DimMyLocationAsDouble
DimmyMSGAsString'消息
DimFileisOverAsBoolean'⽂件是否已经完毕
ConstReceivePort=7905
ConstBUFFER_SIZE=5734
d=True
EndSub
PrivateSubcmdnd_Click()
OnErrorGoToerrorhandle
WithCommonDialog1
.CancelError=True
.DialogTitle="选择您要传送的⽂件"
.Filter="AllFiles(*.*)*.*"
.ShowOpen
EndWith
filehandle=FreeFile
meForBinaryAccessReadAs#filehandle
d=Fal
FileSize=CDbl(FileLen(me))
n="等待回应>>>"
MsgBox("选择的⽂件⼤⼩为"&LOF(filehandle)&"字节")
=sckConnectedThen
tafilecomesMSG&me'发送发出⽂件信息
EndIf
ExitSub
errorhandle:
d=True
MsgBox("你没有选择⼀个⽂件!")
EndSub
PrivateSubForm_Load()
ort=ReceivePort
FileisOver=True
n="准备传输>>>"
EndSub
PublicFunctionSendChunk()
DimmybytesizeAsLong
<>sckConnectedThenExitFunction
mybytesize=BUFFER_SIZE
IfLOF(filehandle)-Loc(filehandle)
ReDimmybyte(0Tomybytesize-1)
Get#filehandle,,mybyte
tamybyte
Sendbyte=Sendbyte+mybytesize
=Int((100/FileSize)*Sendbyte)
IfSendbyte>=FileSizeThen
FileisOver=True
taFileisOverMSG
EndIf
EndFunction
PrivateSubTimer2_Timer()
=sckConnectedThen
d=Fal
d=Fal
<><><><>8
<>9Then
,ReceivePort
==9Then
EndIf
EndSub
PrivateSubWinsockReceive_ConnectionRequest(ByValrequestIDAsLong)
<>
requestID
EndSub
PrivateSubWinsockReceive_DataArrival(ByValbytesTotalAsLong)
ReDimarrdata(0TobytesTotal-1)
aarrdata,vbByte+vbArray
myMSG=StrConv(arrdata,vbUnicode)'⼆进制转为字符串
SelectCaMid(myMSG,1,17)
CafilecomesMSG'这些消息发送⽅和接受⽅都可收到
'显⽰保存对话框
OnErrorGoToerrorhandle
me=Mid(myMSG,17,Len(myMSG))
Title="选择保存⽂件的路径"
ve
filesave=FreeFile
Receivebyte=0
d=Fal
taRecevieIsReadyMSG
CaFileisOverMSG
Clo#filesave
MsgBox("⽂件传输成功!")'⼤家⼀起处理
d=True
d=True
n="准备传输>>>"
=0
taFileisOverMSG
CafilecountMSG
FileSize=Mid(myMSG,18,Len(myMSG))
meForBinaryAccessWriteAs#filesave
taRemoteIsReadyMSG
n="⽂件准备传输!"
FileisOver=Fal
CaEl
IfReceivebyte
Receivebyte=Re
本文发布于:2023-03-05 23:09:08,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678028949150734.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:传文件.doc
本文 PDF 下载地址:传文件.pdf
留言与评论(共有 0 条评论) |