版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、vb中基于tcp/ip协议的点对点文件传输葛斌 摘 要 随着网络的普及,网络编程显得尤其重要。本文使用winsock控件实现两台计算机间的文件传输,描述了winsock控件的使用方法及有关文件传输的算法。 关键词 tcp/ip协议,winsock控件,网络编程,文件传输,断点续传。 随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以tcp/ip协议最为流行。本文讨论的winsock控件,提供了访问tcp/ip网络的捷径,使用它可以不必了解tcp/ip的细节和调用winsock api,只要设置好相应的属性和触发事件后的处理,就可
2、以实现计算机之间的数据通信。一、winsock控件 winsock即windows sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓socket,通常也称作套接字,用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括tcp和udp两种:tcp协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于tcp协
3、议的(例如常用的http、ftp、smtp、pop3等协议);udp协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如real公司的rtsp协议,腾讯公司的qq协议等)。二、winsock控件通信的工作原理 winsock控件是基于socket规范创建的,所以其通信的实质是对socket接口进行数据的读写操作。如果两个应用程序需要通信,它们可以通过使用socket类来建立套接字连接,可以将这个过程想象为一次电话呼叫过程:呼叫者通过拨号与被呼叫者连接,当电话接通时,双方都可以自由通话了,只不过这里的呼叫者被称为“客户”,被呼叫者则称为“服务器”,而号码则为“
4、ip地址+端口”,但在建立连接之前,必须由“客户”发出呼叫,且此时的“服务器”正在监听。因此,基于tcp/ip协议的通信,需要分别建立客户端应用程序和服务器端应用程序。其大致流程如图1所示: 图1 winsock工作原理 端口号被规定在065535范围内的某一个整数,其中01023被预先定义的服务器通信所占用(如telnet占用23,http占用端口80),所以最好使用102465535这些端口中的某一个,以免发生端口冲突。三、基本方法 客户端要与服务器端进行通信,首先,必须知道服务器端的域名或ip地址(remotehost属性),就像要和某人打电话前,必须知道对方的电话号码;其次,还必须和服
5、务器端约定相同的端口(remoteport属性),用于数据的输入和输出;最后,调用connect方法与服务器端建立连接。 服务器端应设置一个监听端口(localport属性),端口应与客户端的端口相同,同时调用listen方法时刻监听客户端的连接请求(connectionrequest事件);当接收到客户端的连接请求时,可调用connectionrequest事件的accept方法,这样与客户端的连接就建立了。 客户端和服务器端成功建立连接后,任何一方都可以自由的发送数据(senddata方法)和接收数据(getdata方法),这些方法都在dataarrival事件中。四、案例实现 这里笔者通
6、过一个实际应用,来说明如何使用winsock控件进行网络通信。实例中有两台计算机,一台作为服务器端,一台作为客户端,实现的功能是将服务器端的某一文件传送到客户端,服务器端和客户端进行点对点的文件传输。 1.实现原理 本文将实现的文件传输只有一个发送方和一个接收方,这是最基本的文件传输方式,运用的原理也比较简单:发送方先获取待传输文件的基本信息,主要是文件名及文件长度(用于创建数据缓冲区);然后,将其发送给接收方;接着,建立和文件一样大小的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据发送给接收方。与此同时,当接收方接收到文件名和文件长度之后,就为其创建新的文件和数据缓冲区;然后,接收传输
7、的文件数据,并将其放在数据缓冲区中;最后,依次将数据缓冲区的数据写入新创建的文件中。这样便完成了不同计算机之间的文件传输。 2.服务器端主程序代码 “通用”中声明如下:option base 1dim data() as byte, send as long 声明数据缓冲区和已传输的数据dim filepath as string, filename as string, filelength as long 存储文件信息发送文件名和文件长度代码:winsock1.senddata filenamewinsock1.senddata filelength发送文件按钮事件的代码:private
8、sub sendfile_click()状态栏显示提示文字statusbar1.simpletext = 向客户端发送数据.open filepath for binary as #1设置数据缓冲区redim data(filelength)读取数据for j = 1 to filelengthget #1, j, data(j)next更新发送的数据send = filelength发送数据winsock1.senddata dataclose #1end sub开启按钮事件的代码:private sub start_click()winsock1.protocol = scktcpprot
9、ocol 以tcp方式进行通信设置服务器通信程序的端口号,这里笔者使用的端口是8080winsock1.localport = val(porttext.text)winsock1.listen 等待客户端连接请求状态栏显示提示文字statusbar1.simpletext = 服务器已工作,准备接受请求end sub客户端请求连接事件代码:private sub winsock1_connectionrequest(byval requestid as long)如果当前连接是打开的,则关闭if winsock1.state 0 thenwinsock1.closeend ifwinsock
10、1.accept requestid 接受客户请求statusbar1.simpletext = 有客户请求,建立连接。end sub 运行结果如图2所示:图2 服务器端运行效果 3.客户端主程序代码 “通用”中声明如下:option base 1dim flag as boolean 设置开关dim filename as string, filelength as long 存储文件信息dim data() as byte, received as long 声明数据缓冲区和已接收的数据初始化开关private sub form_load()flag = trueend sub连接按钮事件
11、的代码:private sub connect_click()winsock1.protocol = scktcpprotocol 以tcp方式进行通信设置远程服务器ip地址,为方便调试笔者使用的是自身的ip地址winsock1.remotehost = hosttext.text设置远程服务器通信程序端口号,与服务器端相同winsock1.remoteport = val(porttext.text)winsock1.connect 与服务器端建立连接end sub数据到达事件的代码:private sub winsock1_dataarrival(byval bytestotal as l
12、ong)状态栏显示提示文字statusbar1.simpletext = 正在接收服务器发送的数据.先接收文件名和文件的长度if flag = true thenwinsock1.getdata filename, vbstring, bytestotal - 4winsock1.getdata filelength, vblong建立文件open filename for binary as #1flag = falseelse设置缓冲区redim data(bytestotal)接收数据并写入文件winsock1.getdata data, vbarray + vbbytefor j =
13、received + 1 to received + bytestotalput #1, j, data(j - received - 1)next更新接收到的数据received = received + bytestotalprogressbar1.value = int(received / filelength) * 100)if progressbar1.value = 100 then close #1end ifend sub 运行结果如图3所示: 图3 客户端运行效果 从以上的实例中,基本了解了有关winsock 控件的使用方法和文件传输的过程。然而,当需要传送的数据比较大时,
14、就不能像以上介绍的那样,直接将整个文件放入数据缓冲区中了,我们的内存是无法忍受用一个几百mb甚至上gb的空间去存储那些临时数据的。显然,这种做法已远不能满足我们的需求,这时可以将文件按照一定的大小,分成若干个数据包(远小于内存的容量)。首先,设置数据包的大小(如64k),根据文件的基本信息(主要文件的长度),计算出总共需要的数据包数;然后,依次读取同数据包一样大小的数据到数据缓冲区中;接着,将数据缓冲区中的数据,发送到指定的计算机上;同时在另一端,建立一个数据缓冲区,缓冲区的大小要根据接收到的数据来确定,依次接收客户端传输过来的数据包,并将数据缓冲区的数据写入相应的文件中,这样就很容易实现大文
15、件的传输了。 但还有些时候,当我们在传输文件的过程中,突然被意外中断,导致网络连接中断。这时,我们又不得不再次将文件重新传输一次,显然这浪费了不少的时间,那怎样解决这类问题呢?这就涉及到断点续传了,即我们可以接着上次未传输完的地方,继续传输文件。 断点续传的方法有多种,比较常见的一种是通过设置一个临时文件,记录已经传输的文件信息,当传输文件中断时,可以通过临时文件的数据来推算出未传输的数据;然后,在每次进行文件传输前,都先查找文件是否有临时文件,并将此信息传输给服务器端,于是服务器端可据此再接着进行传输剩余的数据,当文件全部传输完毕时,删除临时文件,这样就实现了断点续传。这里笔者依然通过上面的
16、那个实例,来说明如何在vb中使用winsock控件实现文件的分块传输和断点续传。 4.服务器端主程序如下 “通用”中声明如下:option base 1const packsize as long = 65536 每包大小为64kdim filepath as string, filename as string, filelength as long 存储文件信息dim data() as byte, pack as long, send as long 数据缓冲区,文件包数,已传输的数据“发送文件”按钮事件代码:private sub sendfile_click()statusbar1.
17、simpletext = 向客户端发送数据计算需要传输文件的包数pack = (filelength - send) packsizeif (filelength - send) mod packsize) 0 then pack = pack + 1if pack = 0 then pack = pack + 1传输文件open filepath for binary as #1for i = 1 to pack如果只有一包if pack = 1 thenredim data(filelength - send)读取数据for j = send + 1 to filelengthget #1
18、, j, data(j - send)next更新已传输文件的数据send = filelength发送文件数据winsock1.senddata data如果是最后一包elseif i + 1 = pack then读取最后一包的数据redim data(filelength - send)for j = 1 to filelength - sendget #1, send + j, data(j)next发送文件数据winsock1.senddata data更新已传输文件的数据send = filelengthexit forelse将文件数据放到数据缓冲区redim data(pack
19、size)for j = 1 to packsizeget #1, send + j, data(j)next发送文件数据winsock1.senddata data更新已传输文件的数据send = send + packsizeend ifprogressbar1.value = int(send / filelength) * 100)nextprogressbar1.value = int(send / filelength) * 100)close #1end sub返回客户端已接收文件的数据private sub winsock1_dataarrival(byval bytestot
20、al as long)winsock1.getdata send, vblongend sub 运行效果如图4所示: 图4 服务器端断点续传的运行效果 5.客户端主程序如下 数据到达事件的代码:private sub winsock1_dataarrival(byval bytestotal as long)statusbar1.simpletext = 正在接收服务器的数据.if sign = true then分别接收传输文件的文件名、文件长度winsock1.getdata filename, vbstring, bytestotal - 4winsock1.getdata filelength, vblong为传输文件设置临时文件tempfile = filename + .td返回已接收的数据open filename for binary as #1open tempfile for binary as #2if lof(2) 0 theninput #2, recei
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒店总经理年终工作计划参考模板
- 小学心理工作计划集锦
- 2025年度班主任工作实习计划范文
- 小学语文第二学期教研计划
- 《食品安全事故总结》课件
- 2025年一周工作计划表格式
- 幼儿园工作计划:个人工作计划
- 《蔬菜陈列培训》课件
- 《复合伤的麻醉》课件
- 《地面工程质量事故》课件
- 2024年PE工程师培训教材-助力工程师成长
- 机动车检测站新换版20241124质量管理手册
- 大部分分校:地域文化形考任务一-国开(CQ)-国开期末复习资料
- 【物理】期末复习练习 质量与密度 2024-2025学年人教版物理八年级上册
- 2024年人教版六年级科学(上册)期末考卷及答案(各版本)
- GB/T 44143-2024科技人才评价规范
- 广东佛山生育保险待遇申请表
- (完整版)公司企业HSE管理体系及制度
- 校长任职期间经济责任履行述职报告
- 药物研发与评价研讨之包装材料和容器变更的技术要求及案例分析
- 化工装置建设流程
评论
0/150
提交评论