VB点对点文件传输.docx

上传人:b****1 文档编号:1759190 上传时间:2023-05-01 格式:DOCX 页数:10 大小:79.32KB
下载 相关 举报
VB点对点文件传输.docx_第1页
第1页 / 共10页
VB点对点文件传输.docx_第2页
第2页 / 共10页
VB点对点文件传输.docx_第3页
第3页 / 共10页
VB点对点文件传输.docx_第4页
第4页 / 共10页
VB点对点文件传输.docx_第5页
第5页 / 共10页
VB点对点文件传输.docx_第6页
第6页 / 共10页
VB点对点文件传输.docx_第7页
第7页 / 共10页
VB点对点文件传输.docx_第8页
第8页 / 共10页
VB点对点文件传输.docx_第9页
第9页 / 共10页
VB点对点文件传输.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

VB点对点文件传输.docx

《VB点对点文件传输.docx》由会员分享,可在线阅读,更多相关《VB点对点文件传输.docx(10页珍藏版)》请在冰点文库上搜索。

VB点对点文件传输.docx

VB点对点文件传输

VB中基于TCP/IP协议的点对点文件传输

 

    随着网络的普及,网络编程显得尤其重要。

本文使用Winsock控件实现两台计算机间的文件传输,描述了Winsock控件的使用方法及有关文件传输的算法。

   关键词TCP/IP协议,Winsock控件,网络编程,文件传输,断点续传。

   随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP协议最为流行。

本文讨论的Winsock控件,提供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用WinsockAPI,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信。

一、Winsock控件

   Winsock即WindowsSockets规范的简称,是目前最流行的网络通信应用程序接口之一。

所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

应用程序通常通过“套接字”向网络发出请求或者应答网络请求。

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。

Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:

TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。

二、Winsock控件通信的工作原理

   Winsock控件是基于Socket规范创建的,所以其通信的实质是对Socket接口进行数据的读写操作。

如果两个应用程序需要通信,它们可以通过使用Socket类来建立套接字连接,可以将这个过程想象为一次电话呼叫过程:

呼叫者通过拨号与被呼叫者连接,当电话接通时,双方都可以自由通话了,只不过这里的呼叫者被称为“客户”,被呼叫者则称为“服务器”,而号码则为“IP地址+端口”,但在建立连接之前,必须由“客户”发出呼叫,且此时的“服务器”正在监听。

因此,基于TCP/IP协议的通信,需要分别建立客户端应用程序和服务器端应用程序。

其大致流程如图1所示:

 

                                 图1Winsock工作原理

   端口号被规定在0~65535范围内的某一个整数,其中0~1023被预先定义的服务器通信所占用(如telnet占用23,http占用端口80),所以最好使用1024~65535这些端口中的某一个,以免发生端口冲突。

三、基本方法

   客户端要与服务器端进行通信,首先,必须知道服务器端的域名或IP地址(RemoteHost属性),就像要和某人打电话前,必须知道对方的电话号码;其次,还必须和服务器端约定相同的端口(RemotePort属性),用于数据的输入和输出;最后,调用Connect方法与服务器端建立连接。

   服务器端应设置一个监听端口(LocalPort属性),端口应与客户端的端口相同,同时调用Listen方法时刻监听客户端的连接请求(ConnectionRequest事件);当接收到客户端的连接请求时,可调用ConnectionRequest事件的Accept方法,这样与客户端的连接就建立了。

   客户端和服务器端成功建立连接后,任何一方都可以自由的发送数据(SendData方法)和接收数据(GetData方法),这些方法都在DataArrival事件中。

四、案例实现

   这里笔者通过一个实际应用,来说明如何使用Winsock控件进行网络通信。

实例中有两台计算机,一台作为服务器端,一台作为客户端,实现的功能是将服务器端的某一文件传送到客户端,服务器端和客户端进行点对点的文件传输。

   1.实现原理

   本文将实现的文件传输只有一个发送方和一个接收方,这是最基本的文件传输方式,运用的原理也比较简单:

发送方先获取待传输文件的基本信息,主要是文件名及文件长度(用于创建数据缓冲区);然后,将其发送给接收方;接着,建立和文件一样大小的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据发送给接收方。

与此同时,当接收方接收到文件名和文件长度之后,就为其创建新的文件和数据缓冲区;然后,接收传输的文件数据,并将其放在数据缓冲区中;最后,依次将数据缓冲区的数据写入新创建的文件中。

这样便完成了不同计算机之间的文件传输。

   2.服务器端主程序代码

   “通用”中声明如下:

OptionBase1

Dimdata()AsByte,sendAsLong '声明数据缓冲区和已传输的数据

DimfilepathAsString,filenameAsString,filelengthAsLong '存储文件信息

'发送文件名和文件长度代码:

Winsock1.SendDatafilename

Winsock1.SendDatafilelength

"发送文件"按钮事件的代码:

PrivateSubsendfile_Click()

'状态栏显示提示文字

StatusBar1.SimpleText="向客户端发送数据..."

OpenfilepathForBinaryAs#1

'设置数据缓冲区

ReDimdata(filelength)

'读取数据

Forj=1Tofilelength

Get#1,j,data(j)

Next

'更新发送的数据

send=filelength

'发送数据

Winsock1.SendDatadata

Close#1

EndSub

"开启"按钮事件的代码:

PrivateSubstart_Click()

Winsock1.Protocol=sckTCPProtocol'以TCP方式进行通信

'设置服务器通信程序的端口号,这里笔者使用的端口是8080

Winsock1.LocalPort=Val(portText.Text)

Winsock1.Listen'等待客户端连接请求

'状态栏显示提示文字

StatusBar1.SimpleText="服务器已工作,准备接受请求…"

EndSub

"客户端请求连接"事件代码:

PrivateSubWinsock1_ConnectionRequest(ByValrequestIDAsLong)

'如果当前连接是打开的,则关闭

IfWinsock1.State<>0Then

Winsock1.Close

EndIf

Winsock1.AcceptrequestID'接受客户请求

StatusBar1.SimpleText="有客户请求,建立连接。

"

EndSub

   运行结果如图2所示:

 

图2服务器端运行效果

   3.客户端主程序代码

   “通用”中声明如下:

OptionBase1

DimflagAsBoolean '设置开关

DimfilenameAsString,filelengthAsLong '存储文件信息

Dimdata()AsByte,receivedAsLong  '声明数据缓冲区和已接收的数据

'初始化开关

PrivateSubForm_Load()

flag=True

EndSub

"连接"按钮事件的代码:

PrivateSubconnect_Click()

Winsock1.Protocol=sckTCPProtocol '以TCP方式进行通信

'设置远程服务器IP地址,为方便调试笔者使用的是自身的IP地址

Winsock1.RemoteHost=hostText.Text

'设置远程服务器通信程序端口号,与服务器端相同

Winsock1.RemotePort=Val(portText.Text)

Winsock1.connect '与服务器端建立连接

EndSub

"数据到达"事件的代码:

PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)

'状态栏显示提示文字

StatusBar1.SimpleText="正在接收服务器发送的数据..."

'先接收文件名和文件的长度

Ifflag=TrueThen

Winsock1.GetDatafilename,vbString,bytesTotal-4

Winsock1.GetDatafilelength,vbLong

'建立文件

OpenfilenameForBinaryAs#1

flag=False

Else

'设置缓冲区

ReDimdata(bytesTotal)

'接收数据并写入文件

Winsock1.GetDatadata,vbArray+vbByte

Forj=received+1Toreceived+bytesTotal

Put#1,j,data(j-received-1)

Next

'更新接收到的数据

received=received+bytesTotal

ProgressBar1.Value=Int((received/filelength)*100)

IfProgressBar1.Value>=100ThenClose#1

EndIf

EndSub

   运行结果如图3所示:

 

                         图3 客户端运行效果

   从以上的实例中,基本了解了有关Winsock控件的使用方法和文件传输的过程。

然而,当需要传送的数据比较大时,就不能像以上介绍的那样,直接将整个文件放入数据缓冲区中了,我们的内存是无法忍受用一个几百MB甚至上GB的空间去存储那些临时数据的。

显然,这种做法已远不能满足我们的需求,这时可以将文件按照一定的大小,分成若干个数据包(远小于内存的容量)。

首先,设置数据包的大小(如64K),根据文件的基本信息(主要文件的长度),计算出总共需要的数据包数;然后,依次读取同数据包一样大小的数据到数据缓冲区中;接着,将数据缓冲区中的数据,发送到指定的计算机上;同时在另一端,建立一个数据缓冲区,缓冲区的大小要根据接收到的数据来确定,依次接收客户端传输过来的数据包,并将数据缓冲区的数据写入相应的文件中,这样就很容易实现大文件的传输了。

   但还有些时候,当我们在传输文件的过程中,突然被意外中断,导致网络连接中断。

这时,我们又不得不再次将文件重新传输一次,显然这浪费了不少的时间,那怎样解决这类问题呢?

这就涉及到"断点续传"了,即我们可以接着上次未传输完的地方,继续传输文件。

   "断点续传"的方法有多种,比较常见的一种是通过设置一个临时文件,记录已经传输的文件信息,当传输文件中断时,可以通过临时文件的数据来推算出未传输的数据;然后,在每次进行文件传输前,都先查找文件是否有临时文件,并将此信息传输给服务器端,于是服务器端可据此再接着进行传输剩余的数据,当文件全部传输完毕时,删除临时文件,这样就实现了"断点续传"。

这里笔者依然通过上面的那个实例,来说明如何在VB中使用Winsock控件实现文件的分块传输和断点续传。

   4.服务器端主程序如下

   “通用”中声明如下:

OptionBase1

ConstPACKSIZEAsLong=65536 '每包大小为64K

DimfilepathAsString,filenameAsString,filelengthAsLong'存储文件信息

Dimdata()AsByte,packAsLong,sendAsLong'数据缓冲区,文件包数,已传输的数据

“发送文件”按钮事件代码:

PrivateSubsendfile_Click()

StatusBar1.SimpleText="向客户端发送数据…"

'计算需要传输文件的包数

pack=(filelength-send)\PACKSIZE

If((filelength-send)ModPACKSIZE)<>0Thenpack=pack+1

Ifpack=0Thenpack=pack+1

'传输文件

OpenfilepathForBinaryAs#1

Fori=1Topack

'如果只有一包

Ifpack=1Then

ReDimdata(filelength-send)

'读取数据

Forj=send+1Tofilelength

Get#1,j,data(j-send)

Next

'更新已传输文件的数据

send=filelength

'发送文件数据

Winsock1.SendDatadata

'如果是最后一包

ElseIfi+1=packThen

'读取最后一包的数据

ReDimdata(filelength-send)

Forj=1Tofilelength-send

Get#1,send+j,data(j)

Next

'发送文件数据

Winsock1.SendDatadata

'更新已传输文件的数据

send=filelength

ExitFor

Else

'将文件数据放到数据缓冲区

ReDimdata(PACKSIZE)

Forj=1ToPACKSIZE

Get#1,send+j,data(j)

Next

'发送文件数据

Winsock1.SendDatadata

'更新已传输文件的数据

send=send+PACKSIZE

EndIf

ProgressBar1.Value=Int((send/filelength)*100)

Next

ProgressBar1.Value=Int((send/filelength)*100)

Close#1

EndSub

'返回客户端已接收文件的数据

PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)

Winsock1.GetDatasend,vbLong

EndSub

   运行效果如图4所示:

 

                           图4 服务器端断点续传的运行效果

   5.客户端主程序如下

   "数据到达"事件的代码:

PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)

StatusBar1.SimpleText="正在接收服务器的数据..."

Ifsign=TrueThen

'分别接收传输文件的文件名、文件长度

Winsock1.GetDatafilename,vbString,bytesTotal-4

Winsock1.GetDatafilelength,vbLong

'为传输文件设置临时文件

tempfile=filename+".td"

'返回已接收的数据

OpenfilenameForBinaryAs#1

OpentempfileForBinaryAs#2

IfLOF

(2)>0Then

Input#2,received

Winsock1.SendDatareceived

EndIf

Close#2

sign=False

Else

OpentempfileForOutputAs#2

'建立数据缓冲区

ReDimdata(bytesTotal)

'接收服务器端传输的数据

Winsock1.GetDatadata,vbArray+vbByte

'将接收的数据写入文件

Forj=received+1Toreceived+bytesTotal

Put#1,j,data(j-received-1)

Next

'更新已接收的数据

received=received+bytesTotal

'更新临时文件

Write#2,received

ProgressBar1.Value=Int((received/filelength)*100)

'传输完毕

IfProgressBar1.Value>=100Then

StatusBar1.SimpleText="数据传输完毕!

"

Close#2

'删除临时文件

Kill(tempfile)

Close#1

EndIf

Close#2

EndIf

EndSub

   运行效果如图5所示:

 

                         图5 客户端断点续传的效果

五、结语

  本文通过在VB中使用Winsock控件,实现网络之间的文件传输,更进一步理解了其工作原理。

此外,笔者还介绍了在网络传输文件是要注意的问题,并对怎样处理传输文件比较大时的情况进行了详细的分析,并通过实际的方法实现了文件的“断点续传”,可以满足实际中的要求,其设计的思想也具有普遍的通用性。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2