




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VBwinsock中基于TCPIP协议的点对点文件传输 VB中基于TCP/IP协议的点对点文件传输摘要随着网络的普及,网络编程显得尤其重要。 本文使用Winsock控件实现两台计算机间的文件传输,描述了Winsock控件的使用方法及有关文件传输的算法。 关键词TCP/IP协议,Winsock控件,网络编程,文件传输,断点续传。 随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP协议最为流行。 本文讨论的Winsock控件,提供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用Winsock API,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信。 一、Winsock控件Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。 所谓Socket,通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。 应用程序通常通过“套接字”向网络发出请求或者应答网络请求。 Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。 Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的、FTP、SMTP、POP3等协议);UDP协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。 二、Winsock控件通信的工作原理Winsock控件是基于Socket规范创建的,所以其通信的实质是对Socket接口进行数据的读写操作。 如果两个应用程序需要通信,它们可以通过使用Socket类来建立套接字连接,可以将这个过程想象为一次电话呼叫过程呼叫者通过拨号与被呼叫者连接,当电话接通时,双方都可以自由通话了,只不过这里的呼叫者被称为“客户”,被呼叫者则称为“服务器”,而号码则为“IP地址+端口”,但在建立连接之前,必须由“客户”发出呼叫,且此时的“服务器”正在监听。 因此,基于TCP/IP协议的通信,需要分别建立客户端应用程序和服务器端应用程序。 其大致流程如图1所示图1Winsock工作原理端口号被规定在065535范围内的某一个整数,其中01023被预先定义的服务器通信所占用(如tel占用23,占用端口80),所以最好使用102465535这些端口中的某一个,以免发生端口冲突。 三、基本方法客户端要与服务器端进行通信,首先,必须知道服务器端的域名或IP地址(RemoteHost属性),就像要和某人打电话前,必须知道对方的电话号码;其次,还必须和服务器端约定相同的端口(RemotePort属性),用于数据的输入和输出;最后,调用Connect方法与服务器端建立连接。 服务器端应设置一个监听端口(LocalPort属性),端口应与客户端的端口相同,同时调用Listen方法时刻监听客户端的连接请求(ConnectionRequest事件);当接收到客户端的连接请求时,可调用ConnectionRequest事件的Aept方法,这样与客户端的连接就建立了。 客户端和服务器端成功建立连接后,任何一方都可以自由的发送数据(SendData方法)和接收数据(GetData方法),这些方法都在DataArrival事件中。 四、案例实现这里笔者通过一个实际应用,来说明如何使用Winsock控件进行网络通信。 实例中有两台计算机,一台作为服务器端,一台作为客户端,实现的功能是将服务器端的某一文件传送到客户端,服务器端和客户端进行点对点的文件传输。 1.实现原理本文将实现的文件传输只有一个发送方和一个接收方,这是最基本的文件传输方式,运用的原理也比较简单发送方先获取待传输文件的基本信息,主要是文件名及文件长度(用于创建数据缓冲区);然后,将其发送给接收方;接着,建立和文件一样大小的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据发送给接收方。 与此同时,当接收方接收到文件名和文件长度之后,就为其创建新的文件和数据缓冲区;然后,接收传输的文件数据,并将其放在数据缓冲区中;最后,依次将数据缓冲区的数据写入新创建的文件中。 这样便完成了不同计算机之间的文件传输。 2.服务器端主程序代码“通用”中声明如下Option Base1Dim data()As Byte,send As Long声明数据缓冲区和已传输的数据Dim filepath As String,filename As String,filelength As Long存储文件信息发送文件名和文件长度代码Winsock1.SendData filenameWinsock1.SendData filelength发送文件按钮事件的代码Private Subsendfile_Click()状态栏显示提示文字StatusBar1.SimpleText=向客户端发送数据.Open filepathFor BinaryAs#1设置数据缓冲区ReDim data(filelength)读取数据For j=1To filelengthGet#1,j,data(j)Next更新发送的数据send=filelength发送数据Winsock1.SendData dataClose#1End Sub开启按钮事件的代码Private Substart_Click()Winsock1.Protocol=sckTCPProtocol以TCP方式进行通信设置服务器通信程序的端口号,这里笔者使用的端口是8080Winsock1.LocalPort=Val(portText.Text)Winsock1.Listen等待客户端连接请求状态栏显示提示文字StatusBar1.SimpleText=服务器已工作,准备接受请求End Sub客户端请求连接事件代码Private SubWinsock1_ConnectionRequest(ByVal requestIDAs Long)如果当前连接是打开的,则关闭If Winsock1.State0Then Winsock1.Close End If Winsock1.Aept requestID接受客户请求StatusBar1.SimpleText=有客户请求,建立连接。 End Sub运行结果如图2所示图2服务器端运行效果3.客户端主程序代码“通用”中声明如下Option Base1Dim flagAs Boolean设置开关Dim filename AsString,filelength As Long存储文件信息Dim data()As Byte,received As Long声明数据缓冲区和已接收的数据初始化开关Private SubForm_Load()flag=True End Sub连接按钮事件的代码Private Subconnect_Click()Winsock1.Protocol=sckTCPProtocol以TCP方式进行通信设置远程服务器IP地址,为方便调试笔者使用的是自身的IP地址Winsock1.RemoteHost=hostText.Text设置远程服务器通信程序端口号,与服务器端相同Winsock1.RemotePort=Val(portText.Text)Winsock1.connect与服务器端建立连接End Sub数据到达事件的代码Private SubWinsock1_DataArrival(ByVal bytesTotalAsLong)状态栏显示提示文字StatusBar1.SimpleText=正在接收服务器发送的数据.先接收文件名和文件的长度If flag=True ThenWinsock1.GetData filename,vbString,bytesTotal-4Winsock1.GetData filelength,vbLong建立文件Open filenameFor BinaryAs#1flag=False Else设置缓冲区ReDim data(bytesTotal)接收数据并写入文件Winsock1.GetData data,vbArray+vbByte For j=received+1To received+bytesTotal Put#1,j,data(j-received-1)Next更新接收到的数据received=received+bytesTotal ProgressBar1.Value=Int(received/filelength)*100)If ProgressBar1.Value=100Then Close#1End IfEnd Sub运行结果如图3所示图3客户端运行效果从以上的实例中,基本了解了有关Winsock控件的使用方法和文件传输的过程。 然而,当需要传送的数据比较大时,就不能像以上介绍的那样,直接将整个文件放入数据缓冲区中了,我们的内存是无法忍受用一个几百MB甚至上GB的空间去存储那些临时数据的。 显然,这种做法已远不能满足我们的需求,这时可以将文件按照一定的大小,分成若干个数据包(远小于内存的容量)。 首先,设置数据包的大小(如64K),根据文件的基本信息(主要文件的长度),计算出总共需要的数据包数;然后,依次读取同数据包一样大小的数据到数据缓冲区中;接着,将数据缓冲区中的数据,发送到指定的计算机上;同时在另一端,建立一个数据缓冲区,缓冲区的大小要根据接收到的数据来确定,依次接收客户端传输过来的数据包,并将数据缓冲区的数据写入相应的文件中,这样就很容易实现大文件的传输了。 但还有些时候,当我们在传输文件的过程中,突然被意外中断,导致网络连接中断。 这时,我们又不得不再次将文件重新传输一次,显然这浪费了不少的时间,那怎样解决这类问题呢?这就涉及到断点续传了,即我们可以接着上次未传输完的地方,继续传输文件。 断点续传的方法有多种,比较常见的一种是通过设置一个临时文件,记录已经传输的文件信息,当传输文件中断时,可以通过临时文件的数据来推算出未传输的数据;然后,在每次进行文件传输前,都先查找文件是否有临时文件,并将此信息传输给服务器端,于是服务器端可据此再接着进行传输剩余的数据,当文件全部传输完毕时,删除临时文件,这样就实现了断点续传。 这里笔者依然通过上面的那个实例,来说明如何在VB中使用Winsock控件实现文件的分块传输和断点续传。 4.服务器端主程序如下“通用”中声明如下Option Base1Const PACKSIZEAsLong=65536每包大小为64K DimfilepathAsString,filenameAsString,filelength AsLong存储文件信息Dim data()As Byte,pack AsLong,send AsLong数据缓冲区,文件包数,已传输的数据“发送文件”按钮事件代码Private Subsendfile_Click()StatusBar1.SimpleText=向客户端发送数据计算需要传输文件的包数pack=(filelength-send)PACKSIZE If(filelength-send)Mod PACKSIZE)0Then pack=pack+1If pack=0Then pack=pack+1传输文件Open filepathFor BinaryAs#1For i=1To pack如果只有一包If pack=1Then ReDim data(filelength-send)读取数据For j=send+1To filelengthGet#1,j,data(j-send)Next更新已传输文件的数据send=filelength发送文件数据Winsock1.SendData data如果是最后一包ElseIf i+1=pack Then读取最后一包的数据ReDim data(filelength-send)For j=1To filelength-send Get#1,send+j,data(j)Next发送文件数据Winsock1.SendData data更新已传输文件的数据send=filelength ExitFor Else将文件数据放到数据缓冲区ReDim data(PACKSIZE)For j=1To PACKSIZEGet#1,send+j,data(j)Next发送文件数据Winsock1.SendData data更新已传输文件的数据send=send+PACKSIZE End If ProgressBar1.Value=Int(send/filelength)*100)Next ProgressBar1.Value=Int(send/filelength)*100)Close#1End Sub返回客户端已接收文件的数据Private SubWinsock1_DataArrival(ByVal bytesTotalAsLong)Winsock1.GetData send,vbLong EndSub运行效果如图4所示图4服务器端断点续传的运行效果5.客户端主程序如下数据到达事件的代码Private SubWinsock1_DataArrival(ByVal bytesTotalAsLong)StatusBar1.SimpleText=正在接收服务器的数据.If sign=True Then分别接收传输文件的文件名、文件长度Winsock1.GetData filename,vbString,bytesTotal-4Winsock1.GetData filelength,vbLong为传输文件设置临时文件tempfile=filename+.td返回已接收的数据Open filenameFor BinaryAs#1Open tempfileFor BinaryAs#2If LOF (2)0Then In
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 端午礼品互动活动方案
- 组织爬山团建活动方案
- 美术活动沙龙活动方案
- 电影金鸡奖颁奖活动方案
- 美术生支教活动方案
- 线下速写活动方案
- 矿工中秋活动方案
- 电力创意互动活动方案
- 田径创新活动方案
- 线下花式调酒活动方案
- 2025年新城区行政中心建设项目社会稳定风险评估与治理策略报告
- 广东省公安厅机场公安局招聘警务辅助人员考试真题2024
- 2025年村级后备干部选拔考试题库及答案
- 《大数的认识》 单元测试(含答案)2025-2026学年四年级上册数学人教版
- 2025-2026学年北京版(2024)小学体育与健康三年级全一册《知情绪 善表达》教学设计
- 产前筛查考试题及答案
- 2025年事业编时政题目及答案
- 2025年发展对象培训班题库(附含答案)
- 第一讲-决胜十四五奋发向前行-2025秋形势与政策版本-第二讲-携手周边国家共创美好未来-2025秋形势与政策版本
- 2025年浙江省高考地理真题卷含答案解析
- 2025年上海市普通高中学业水平等级性考试物理试卷(原卷版)
评论
0/150
提交评论