VB实现局域网内的文件传输
为了设计统一和用户操作方便,我们希望将服务端与客户端融合在一起,形成一个程序,这样用户理解起来,更加直观一点(其实这样做也是为了方便调试,大家可以在本机上测试,自己传文件给自己)。所以,我们在程序中需要使用两个Winsock控件,一个负责监听,一个负责发送,当发送端连接成功以后,便选择一个待发送的文件(可以是任意二进制文件),接着将文件名和文件字节长度发送给接收端,接收端收到这个消息以后,将文件名和文件长度解析出来,然后通知发送端可以开始发送文件;发送端读到这个消息之后,将文件流以字节的形式发送到接收端,接收端收到后,将二进制流回写,保存成文件即可。这里要注意两点,一个是由于Winsock每次最大传输8K的内容,所以需要将文件分解,每次传输固定数目的字节流,这样发送和接收时都可以根据这个数目来判断文件传输的进程,一旦字节流数目等于文件的大小,就需要关闭相应的文件句柄;另一点是由于我只使用一个Winsock控件接收,接收文本时需要注意要将UNICODE转码,解析成可识别的信息。
源代码
'下面的代码既是服务器又是客户端
'采用应答式发送方式
'自动拆分文件,包括2进制
OptionExplicit
'PrivateDeclareSubSleepLib"kernel32"(ByValdwMillisecondsAsLong)
Dimmybyte()AsByte'发送方数组
ConstfilecomesMSG="afileiscoming"'有文件到来
ConstRemoteIsReadyMSG="senderisready"'准备好了
ConstFileisOverMSG="thefileisended"'文件完毕
ConstRemoteDenyMSG="theusercanceled"'用户取消
ConstfilecountMSG="thefilelenghis"'文件长度
ConstRecevieIsReadyMSG="Receiverisready"'准备接收
Dimarrdata()AsByte'收到的信息
DimfilesaveAsInteger'保存文件的句柄
DimfilehandleAsInteger'发送方文件的句柄
DimFileSizeAsDouble'文件的大小
DimSendbyteAsLong
DimReceivebyteAsLong
DimMyLocationAsDouble
DimmyMSGAsString'消息
DimFileisOverAsBoolean'文件是否已经完毕
ConstReceivePort=7905
ConstBUFFER_SIZE=5734
PrivateSubcmdConnect_Click()
Timer2.Enabled=True
EndSub
PrivateSubcmdsend_Click()
OnErrorGoToerrorhandle
WithCommonDialog1
.CancelError=True
.DialogTitle="选择您要传送的文件"
.Filter="AllFiles(*.*)|*.*"
.ShowOpen
EndWith
filehandle=FreeFile
OpenCommonDialog1.FileNameForBinaryAccessReadAs#filehandle
cmdSend.Enabled=False
FileSize=CDbl(FileLen(CommonDialog1.FileName))
Label1.Caption="等待回应>>>"
MsgBox("选择的文件大小为"&LOF(filehandle)&"字节")
IfWinsockSend.State=sckConnectedThen
WinsockSend.SendDatafilecomesMSG&CommonDialog1.FileName'发送发出文件信息
EndIf
ExitSub
errorhandle:
cmdSend.Enabled=True
MsgBox("你没有选择一个文件!")
EndSub
PrivateSubForm_Load()
WinsockReceive.LocalPort=ReceivePort
WinsockReceive.Listen
FileisOver=True
Label1.Caption="准备传输>>>"
EndSub
PublicFunctionSendChunk()
DimmybytesizeAsLong
IfWinsockSend.State<>sckConnectedThenExitFunction
mybytesize=BUFFER_SIZE
IfLOF(filehandle)-Loc(filehandle)<BUFFER_SIZEThenmybytesize=(LOF(filehandle)-Loc(filehandle))
ReDimmybyte(0Tomybytesize-1)
Get#filehandle,,mybyte
WinsockSend.SendDatamybyte
Sendbyte=Sendbyte+mybytesize
ProgressBar1.Value=Int((100/FileSize)*Sendbyte)
IfSendbyte>=FileSizeThen
FileisOver=True
WinsockSend.SendDataFileisOverMSG
EndIf
EndFunction
PrivateSubTimer2_Timer()
IfWinsockSend.State=sckConnectedThen
Timer2.Enabled=False
cmdConnect.Enabled=False
ElseIfWinsockSend.State<>1AndWinsockSend.State<>6AndWinsockSend.State<>7AndWinsockSend.State<>8AndWinsockSend.State<>9Then
WinsockSend.ConnecttxtHost.Text,ReceivePort
ElseIfWinsockSend.State=8OrWinsockSend.State=9Then
WinsockSend.Close
EndIf
EndSub
PrivateSubWinsockReceive_ConnectionRequest(ByValrequestIDAsLong)
IfWinsockReceive.State<>sckClosedThenWinsockReceive.Close
WinsockReceive.AcceptrequestID
EndSub
PrivateSubWinsockReceive_DataArrival(ByValbytesTotalAsLong)
ReDimarrdata(0TobytesTotal-1)
WinsockReceive.GetDataarrdata,vbByte+vbArray
myMSG=StrConv(arrdata,vbUnicode) '二进制转为字符串
SelectCaseMid(myMSG,1,17)
CasefilecomesMSG'这些消息发送方和接受方都可收到
'显示保存对话框
OnErrorGoToerrorhandle
CommonDialog1.FileName=Mid(myMSG,17,Len(myMSG))
CommonDialog1.DialogTitle="选择保存文件的路径"
CommonDialog1.ShowSave
filesave=FreeFile
Receivebyte=0
cmdSend.Enabled=False
WinsockReceive.SendDataRecevieIsReadyMSG
CaseFileisOverMSG
Close#filesave
MsgBox("文件传输成功!")'大家一起处理
cmdConnect.Enabled=True
cmdSend.Enabled=True
Label1.Caption="准备传输>>>"
ProgressBar1.Value=0
WinsockReceive.SendDataFileisOverMSG
WinsockReceive.Close
WinsockReceive.Listen
CasefilecountMSG
FileSize=Mid(myMSG,18,Len(myMSG))
OpenCommonDialog1.FileNameForBinaryAccessWriteAs#filesave
WinsockReceive.SendDataRemoteIsReadyMSG
Label1.Caption="文件准备传输!"
FileisOver=False
CaseElse
IfReceivebyte<FileSizeThen
Receivebyte=Receivebyte+bytesTotal
Put#filesave,,arrdata
WinsockReceive.SendDataRemoteIsReadyMSG
ProgressBar1.Value=Int((100/FileSize)*Receivebyte)
EndIf
EndSelect
ExitSub
errorhandle:
WinsockReceive.SendDataRemoteDenyMSG
cmdConnect.Enabled=True
EndSub
PrivateSubWinsockSend_DataArrival(ByValbytesTotalAsLong)
WinsockSend.GetDatamyMSG
SelectCasemyMSG
CaseRecevieIsReadyMSG
WinsockSend.SendDatafilecountMSG&FileSize
FileisOver=False
Sendbyte=0
CaseRemoteIsReadyMSG
'如果文件还没有结束,继续传输
IfNotFileisOverThen
Label1.Caption="文件正在被传输>>>"
SendChunk
Else
WinsockSend.SendDataFileisOverMSG
EndIf
CaseFileisOverMSG
'主机处理
Close#filehandle
MsgBox("文件传输成功!")'大家一起处理
WinsockSend.SendDataFileisOverMSG
WinsockSend.Close
cmdConnect.Enabled=True
ProgressBar1.Value=0
cmdSend.Enabled=True
Label1.Caption="准备传输>>>"
CaseRemoteDenyMSG
MsgBox("用户终止了传输!")
cmdSend.Enabled=True
Label1.Caption="准备传输>>>"
Close#filehandle
EndSelect
ExitSub
EndSub
温馨提示:内容为网友见解,仅供参考
怎样用VB编写一个在局域网中能同时传输多个文件的程序?
如果是指定的共享文件夹,你可以使shell语句,调用一个copy。也可以使用filessystemobject对像的拷贝命令来做。要知道,如果是已知的共享文件夹的话,你实际就等于在做一个本地移动或复制文件的操作。如果待传输文件是提前无法预知的,就再挂一个dialog控件就可以了 ...
请问各位VB神仙,谁知道在局域网中使用VB将文件从本机拷贝到另一台?_百...
除了 唯漠情 说的做法,还可以在所有局域网电脑上开启共享,建立起统一的帐户,可以用同一个账号密码登录不同机器。这样,仅在其中一台电脑上做个软件,自动使用系统的文件共享来传输文件即可。我在亲戚的打印部里,就是用这种方式实现的双机互相备份功能的。
如何用VB实现局域网点对点大文件传输?
局域网内传输大文件最好 使用winsock控件(MSWinsck.ocx)TCP协议 (Protocol="sckTCPProtocol")sendData 方法发东西 DtatArrival 事件里接东西 注意收发数据类型要相同(发送接收最好都用二进制),一次发送多次接收,你自己查下winsock资料.MSDN也有讲的 原理不难,但加上控制与返回信息的话,程序麻烦,...
Vb 6 winsock 局域网传文件太慢,高手进
VB传文件确实不太快, 以前我也写过类似程序。能传到几百K\/S,最快能达1M(这都是在局域网上)。建议你把每次发送的数据包大小改一下。不要用1048576,改为1500左右试下。因为网络包最大为1500。
求利用vb做的一个可以在局域网聊天,传文件的程序
利用WinSock 控件可以与远程计算机建立连接,并通过用户数据文报协议 (UDP)或者传输控制协议 (TCP)进行数据交换。这两种协议都可以用来创建客户与服务器应用程序。与 Timer 控件类似,WinSock 控件在运行时是不可见的。可能的用途创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。创建一个服务器应用...
关于virtualbox中主机与虚拟机之间的文件共享
可以通过在主机中设置共享目录来实现文件传输,或者通过设置网络,通过局域网的方式传输。装好虚拟系统后,首先应该装好VB的增强功能,在虚拟机的“设备”菜单里。1、数据共享:建好虚拟系统后,在右边的“配置明细”中有一个“数据空间”,在里面选一个主机的目录做为共享目录,启动虚拟机后在“网络邻居...
我在家用vb做了一个局域网聊天的小程序,可只能发送文字,如何可以发送...
两种方案:1.在客户端放置动态表情的文件,程序在运行时检测发过来的表情申请命令,比如你发送一个 \/表情1 在程序中转义一下 把本地的表情显示出来就可以了 2.Winsock可以二进制传输的 你把本地表情文件当做比特流发送过去 让对方接受后在处理比特流转换成图片格式 进而显示 ...
最简单的vb远程发送与接收程序》》》并且程序解释
这是一个简单的聊天程序(VB6.0实现),它可以实现在局域网中两台主机间的在线聊天,程序很简单,只有短短的几十行,但“麻雀虽小,五脏俱全”,它已经有了聊天程序的大体框架。我们在它的基础上稍加改进,就能做出不错的聊天小软件呢。为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:Option Explici...
vb.net 用语言怎么读取局域网文件?
正常的使用文件拷贝命令,不过路径上写成 \\\\192.168.0.2\\d$\\r.txt 共享的磁盘要加$符号,共享的目录直接打目录名
vb 运行时错误"40006"--局域网复制文件
MM1垂直于BB1,过N做NN1垂直于BC。很容易证明MM1与NN1平行切与M1N1垂直 在计算MM1=1\/3*a,NN1=1\/3*a 可得矩形MM1N1N是个长方形 得