vb 局域网 文件传输

给一个简单的代码把,谢谢

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是个长方形 得

相似回答