毕业设计(论文)基于VB的网络数据传输_第1页
毕业设计(论文)基于VB的网络数据传输_第2页
毕业设计(论文)基于VB的网络数据传输_第3页
毕业设计(论文)基于VB的网络数据传输_第4页
毕业设计(论文)基于VB的网络数据传输_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、毕业设计说明书(200 8届)基于vb的网络数据传输学生姓名 学 号 系 别 信息与电子系 专业班级 计算机0402 指导教师 完成日期 2008年5月20日 基于vb的网络数据传输摘要 随着internet的普及和工业自动化的迅速发展,网络已深入家庭、办公室、工厂、自动化控制领域。人们在各个地方都可通过互联网来交换信息,因而网络数据传输就显得尤为的重要。在vb中就提供了支持数据传输的控件,如:winsock控件和mscomm控件等。通过程序开发和控件的使用, 可实现网络的数据通信,满足网络用户对数据通信和数据交换的需求。在本文中介绍了利用winsock控件编程实现c/s模式的数据传输;同时在

2、rs-232串口通信中使用mscomm控件编程来模拟实现对受控方的相关操作。关键词 winsock控件;客户端/服务器模式;网络数据传输;串口通信;mscomm控件network data transmissionof based on the visual basicabstractwith the popularity of internet and the rapid development of industrial automation, network has penetrated into home, office, factory, automation fields. peo

3、ple in various places accessible through the internet to exchange informations ,so data transmission in the network is particularly important. however it provided controls of supporting data transmission in the visual basic,like winsock and mscomm control and so on. through the design of procedures

4、and the use of controls, can realize the data communications in the network,and meet the demand of data communications and data exchange for internet users. in this article, will introduce to the use of winsock control programming c / s mode data transmission; at the same time, in the rs-232 serial

5、communication through the mscomm control programs to simulate the realization of the relevant operation.key words winsock control; client/server mode; network data transmission; serial communication; mscomm control目 录中文摘要2英文摘要3第一章 绪论51.1 数据传输及通信概述51.2 课题选择71.3 论文结构7第二章 概述82.1 winsock控件简述92.1.1 winso

6、ck控件介绍92.1.2 winsock控件重要属性、方法、和事件92.2 rs-232串口通信概述122.2.1 rs-232串口通信简述122.2.2 mscomm控件重要属性、方法和事件12第三章 需求分析143.1 功能需求153.2 性能需求15第四章 总体设计154.1 功能模块图154.2 c/s模型时序图164.3 客户端、服务器界面设计17第五章 详细设计215.1 构架模型215.2 通信协议215.3 动态添加客户端225.4 树型目录结构的实现235.5 文件传输模块33第六章 典型问题分析386.1 动态添加、删除客户端问题386.2 文件传送和接收问题386.3 文

7、件夹传输问题386.4 各种命令标志的接收处理问题39第七章 网络数据传输的应用417.1 网络数据传输的应用417.2 网络数据传输与rs-232串口通信结合应用41第八章 设计心得及软件不足438.1 设计心得438.2 软件不足43致 谢44参考文献45附 录46第一章 绪论1.1数据传输及通信概述1. 数据通信方式按传输方向分有:(1) 单工通信:在单工信道上信息只能在一个方向传送。(2) 半双工通信:在半双工信道上,通信的双方可交替发送和接收信息。(3) 全双工通信:一种可以同时进行双向信息传送的通信方式。按同步方式分:(1) 异步传输:把各个字符分开传输,字符之间插入同步信息。其优

8、点是简单,但由于起止位和检验位的加入会引入20%30%的开销,传输的速率也不高。(2) 同步传输:发送方在发送数据之前先发送一串同步字符sync。2交换方式:(1) 线路交换:交换的特点是建立连接需要等待较长的时间。特点:连接建立后通路是专用的。不再有传输延迟,这种交换方式适合于传输大量的数据。在传输少量信息时效率不高。(2) 报文交换:特点:不建立专用链路。线路利用率较高。电子邮件系统(例如e-mail)适合采用报文交换方式。(3) 分组交换:有两种方式:数据报:类似于报文交换。引入分组拆装设备pad(packet assembly and disassembly device)。虚电路:类

9、似于电路交换。 虚电路与线路交换的区别:逻辑连接并不意味着别的通信不能使用这条线路。它仍然具有线路共享的优点。虚电路与数据报的区别:虚电路意味着可靠的通信,它涉及更多的技术,需要更在的开销。没有数据报方式灵活,效率不如数据报方式高。虚电路适合于交互式通信,数据报方式更适合于单向地传送短信息。虚电路可以是暂时的,即会话开始建立,会话结束拆除,这叫虚呼叫;也可以是永久的,即通信双方一开机就自动建立,直到一方(或同时)关机才拆除。这叫永久虚电路。 分组交换的特点:数据包有固定的长度。采用固定的、短的分组相对于报文交换是一个重要的优点。除了交换结点的存储缓冲区可以不些外,也带来了传播时延的减少,分组交

10、换也意味着按分组纠错:发现错误只需重发出错的分组,使通信效率提高。1.2 课题选择随着internet的普及和工业自动化的迅速发展,网络已深入家庭、办公室、工厂、自动化控制领域。人们在各个地点都可通过互联网来交换信息。因而网络数据传输就显得尤为的重要。鉴于对网络数据传输的必要性和重要性的考虑,我选择了基于vb的网络数据传输来作为毕业设计的课题。其意义在于网络数据传输相对与整个互联网络来说有着至关重要的作用,缺失数据传输、数据交换,那每一台计算机只能是孤立的存在,因而这一领域有待我们去开拓、研究,其中有许多求知部分有待去填补。1.3 论文结构本论文介绍了网络数据的必要性与实际应用,重点从wins

11、ock控件进行分析设计,详细介绍了基于vb语言进行c/s模式的设计。全文分为九个章节。第一章 绪论。主要阐述了网络数据传输的时代背景和现实需求。第二章 概述。从大体上阐述了基于vb语言来实现网络数据的传输方式方法和可用的途径。第三章 需求分析。叙述了设计的功能需求和性能需求,明确了软件的主题方向。第四章 总体设计。本章主要介绍软件设计的总体功能模块图,c/s模式的时序图以及软件设计的服务器端和客户端的相关界面的简介。第五章 详细设计。本章分六个小节,分别从构架模型、通信协议、动态添加客户端、树型目录结构的显示、文件传输以及主要功能模块的代码分析来阐述整个设计的详细情况。第六章 典型问题分析。本

12、章主要针对在设计过程中所涉及到的一些难点问题的分析,分四个小节阐述了四个方面值得研究讨论的问题。第七章 网络数据传输的应用。本章主要是叙述了网络数据传输的相应的实际应用,并将本设计与实际应用相结合。在本章第二小节中具体结合rs-232串口通信实现对模拟设备的相关状态数据的接收,以达到远程对设备的控制的目的。第八章 设计心得及软件不足。本章主要论述了在完成整个软件过程中的一些心得体会以及本软件尚存的不足之处。第九章 致谢。第二章 概 述visual basic 是microsoft 公司开发的windows 应用程序开发工具,visual 可视化的,是一种开发图形户界面(gui)的方法.使得非计

13、算机专业的人也可以开发出专业的windows软件. visual basic继承了basic语言简单易学的优点,又增加了许多新的功能,它采用面向对象与事件驱动的程序设计思想,使编程变得更加方便,快捷.使用visual basic既可以开发个人或小组使用的小型工具,又可以开发多媒体软件,数据库应用程序,网络应用程序等大型软件.是国内外最流行的程序设计语言之一.基于visual basic这种操作简便、功能强大的优点,结合网络实际情况和需要,研究开发基于visual basic的网络数据传输的软件。在本文中简单介绍了网络数据传输的相关协议,如tcp/ip协议和udp协议;在实现过程中用到的核心控件

14、,如winsock控件和mscomm控件;介绍了利用winsock控件实现客户端和服务器之间的通信原理;利用mscomm控件来模拟对设备的监控,通过两台模拟机实现各个状态信息读取及相关操作,从另一方面(即rs-232串口通信)来体现数据传输。2.1 winsock控件简述2.1.1 winsock控件介绍 winsock即windows socket,是微软公司对socket编程接口的集成。winsock控件用于windows socket接口简化成易于使用的visual basic内部接口,从而避免通过访问dll来到如windows socket函数,和其他控件一样,有着使用方便的特点。但是

15、winsock控件并不能完全取代socket函数,它使用ip协议,并支持tcp和udp协议,但是支持程度偏低,像多播和广播等特性无法支持,不过在仅仅需要基本的网络数据通信的前提下,windows控件仍然是最好的选择。2.1.2 winsock控件重要属性、方法、和事件(1) 属性protocol:通过protocol属性可以设置winsock控件连接远程计算机使用的协议。可选的协议是tcp和udp,对应的vb中常量分别是scktcpprotocol和sckudpprotocol,winsock控件默认协议是tcp。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。socketha

16、ndle:sockethandle返回当前socket连接的句柄,这是只读属性。remotehostip:返回远程计算机的ip地址。在客户端,当使用了控件的connect方法后,远程计算机的ip地址就赋给了remotehostip属性,而在服务器端,当connectrequest事件后,远程计算机(客户端)的ip地址就赋给了这个属性。如果使用的是udp协议那么当dataarrival事件后,发送udp报文的计算机的ip才赋给了这个属性。bytereceived:返回当前接收缓冲区中的字节数。state:用于返回当前winsock控件的状态。如表2-1所示。表2-1 返回winsock控件当前的

17、状态常数值描述sckclosed0缺省值,关闭sckopen1打开scklistening2侦听sckconnectionpending3连接挂起sckresolvinghost4识别主机sckhostresolved5已识别主机sckconnecting6正在连接sckconnected7已连接sckclosing8同级人员正在关闭连接sckerror9错误(2) 方法bind:用bind方法可以把一个端口号固定为本控件使用,使得别的应用程序能再使用这个端口。listen:只在使用tcp协议时有用。它将应用程序置于监听检测状态。connect:当本地计算机希望和远程计算机建立连接时,就可以调

18、用connect方法。accept:当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。senddata:当连接建立后,要发送数据就可以调用senddata方法,该方法只有一个参数,就是要发送的数据。getdata:当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用getdata方法。peekdata:和getdata方法类似,但peekdata在取得数据后并不把缓冲区清空。(3) 事件connectrequest:当本地计算机接收到远程计算机发送的连接请求时,控件的connectrequest事件将会被触发。sendprogress:当

19、一端的计算机正在向另一端的计算机发送数据时,sendprogress事件将被触发。sendprogress事件记录了当前状态下已发送的字节数和剩余字节数。sendcomplete:当所有数据发送完成时,被触发。dataarrival:当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。error:当在工作中发生任何错误都会触发这个事件。2.2 rs-232串口通信概述2.2.1 rs-232串口通信简述串行通信端口(serial communication port)在系统控制的范围中一直占据着及其重要的地位,它不仅没有因为时代的进步而遭

20、淘汰,反而在规格上越来越完善,应用也越来越广泛。现在,串行通信端口(rs-232)是计算机上的标准配置,用途上则以连接调制解调器来传输数据最为常见,如图2-1所示为串口外观。当然,它的重要性还不只如此。rs-232串行通信端口是每台计算机上的必要-配备,通常有com1和com2两个端口。一般计算机将com1端口以9引脚的接头接出,而以25脚的接头将com2端口接出。新一代的计算机均以9引脚接头接出所有的rs-232通信端口。图2-1 串口外观图2.2.2 mscomm控件重要属性、方法和事件不同于其他控件,mscomm只有一个事件即oncomm事件,所有可能发生的状况(错误或引发通信事件)都集

21、中在这个事件中处理,通过对这些状况的处理来实现各种控制和传输,如下表列的即为mscomm控件的oncomm事件中所含的各种可能出现的事件状况:表2-1 mscomm控件属性属性描述commport设置并返回通讯端口号settings字符串的形式设置并返回波特率、奇偶校验、数据位、停止portopen设置并返回通讯端口的状态。也可以打开和关闭端口input从接收缓冲区返回和删除字符output向传输缓冲区写一个字符串iubuffercount用于返回在接收缓冲区中的字符数inputmode设置或返回input属性取回的数据类型表2-2 mscomm控件事件事件描述comeventbreak收到中

22、断信号comeventcdto载波检测超时comeventctstocts信号超时comeventdsrtodsr信号超时comeventframe发送框架发生错误comeventoverrun数据遗失comeventrxover接收缓冲区满溢comeventrxparity极性错误comeventtxfull发送缓冲区已满comeventdcb连接时发生非预期错误comevcdcd线的状态发生变化comevctscts线的状态发生变化comevdsrdsr线的状态发生变化comevringring indicator 变化comevreceiverthreshold#of chars第三章

23、需求分析3.1 功能需求1. 动态添加客户端:服务器端能够实现与多个客户端之间建立连接并进行通信。2. 客户端树型目录结构显示:服务器可以显示客户端的树型目录结构,能够方面的抓取客户端机器上的任何文件。3. 字符和字符串的传输:可以与客户端之间进行简单的消息通信,双方可以交互信息。4. 各种格式的文件传输:对于不同格式的文件如视频、音频、常用文件word,excel,txt等等,可以实现传输操作。5. 文件夹的传输:除了单个文件实现传输以外,还需要实现对整个文件夹的传输。6. 单个发送和群发:对于消息可以指定发送也可以群发消息,同时也可以实现对服务器端某个文件指定客户端发送也可以群发给所有连接

24、成功发客户端。3.2 性能需求1. 稳定性在程序设计中应当考虑到各种可能发生的情况,进而避免常规或者一些低级错误。一旦发生任何错误或突发事件,系统要能够正常运行甚至及时纠错,不至于瘫痪而使得软件无法运行下去。那么在设计对于一些不常规的输入和操作均作了相应的限制,从某种程度上提升了软件的稳定性。2. 易用性本程序仅仅是一个雏形,容易上手,操作简单,使用过程一目了然。相关命令标志处理和临时处理均使用文件,操作起来比较简便。 第四章 总体设计4.1 功能模块图图4-1 c/s模式总体功能模块4.2 c/s模型时序图图4-2面向连接的c/s模型时序图4.3 客户端、服务器界面设计图4-3 服务器主界面

25、图4-4 服务器端带消息窗口界面图4-5 客户端主界面第五章 详细设计5.1 构架模型图5-1 c/s 模型构架图5.2 通信协议在开始编程之前首先应当对客户端和服务器之间的通信协议进行定义,以便双方在通信过程中可以方便的识别彼此的通信指令和标志。1.服务器端通信协议定义如表5-1所示:表5-1 服务器端标志命令标志命令标志解释read读取驱动盘符标志信息fl_pa_为读取当前选中目录的当下的所有子目录,即展开选中目录opt_pa传输单个文件标志信息ins_tr确认传输标志accept接收数据完毕标志mesg消息传输标志stop断开连接标志optpa传输文件夹标志信息2. 客户端通信协议定义如

26、下:表5-2 服务器端标志命令标志命令标志解释fl_dir压缩文件夹的长度标志,后跟某压缩文件夹的长度,同时初始化作好接收准备mesg客户端信息标志fl_len单个文件长度标志,同时初始化文件名,用以接收pause与客户端断开连接标志re_dir、re_fle在显示数形目录结构时目录中的文件夹和文件标志5.3 动态添加客户端单个客户端与服务器通过winsock控件实现通信以后,必须结合实际情况实现多个客户端与服务器之间的数据通信,这就涉及到服务器需要有动态添加客户端的能力,与请求连接的客户端建立彼此间连接。在设计中我采用winsock数组来实现服务器端的动态添加功能,winsock(0)设计为

27、服务器端一直保持监听客户端连接请求的控件,如果监听到有客户端的连接请求,首先查找数组中是否存在空闲的winsock(x),如果存在,则使用该winsock(x)与之建立连接,反之加载一个新的winsock数组控件与之建立连接。一旦与客户端建立连接成功后,服务器将把该winsock的数组下标发送给该客户端,如服务器端是使用winsock(2)与客户端建立连接,则将索引2发送给客户端,此时该客户端就作为“2号客户端”,同时在服务器端的listbox客户端状态列表中作为2号客户端显示5.4 树型目录结构的实现树型目录结构的显示是这个设计中的一个特点,总体是模仿微软的资源管理器,当然外观效果还不是很完

28、善,其中目录中“+”符号以及空格是目录之间区分上下级的一个关键标志,如上级目录和当下的文件夹子目录之间相差一个空格,而“+”“-”符号主要是对目录展开和收起起到一个指示作用。该功能设计的总体思路如下:当服务器端选种“客户端状态”列表中连接成功的客户端时,向该客户端发送命令标志,要求回传其磁盘驱动列表信息如c盘,d盘等;如果服务器端继续点选某磁盘驱动,则向客户端发送该磁盘路径,要求返回该磁盘当下所有的文件夹和文件信息,返回后,在该磁盘当下显示文件夹目录,并在“文档”列表中显示该磁盘驱动下的文件名,依次类推,可逐级显示目录信息;如果某级目录已经展开,那么起前将显示“-”符号,再次点击该目录时,将收

29、起该目录(即删除该目录下的所有信息),此时其前面将显示“+”符号。对于具体实现,如图5-2所示。以下是客户端根据服务器端指定的目录路径进行相应的查找,并返回该目录下的子目录和文件名称。图 5-2 客户端根据指定目录查找子目录和文件主流程服务器端查看客户端的树形目录,模拟实现本机上的资源管理器来抓取客户端上的某些文件。在实现过程中考虑到目录的深浅,如果初始化就将客户端的所有目录全部显示在列表中,会带来不必要的麻烦,所以采取的方法是服务器端点选某级目录就向客户端发送读区该级目录的命令,以达到减少时间复杂度和空间复杂度的目的,具体实现流程如图5-3所示。图5-3 服务器端查看树形目录主流程5.5 文

30、件传输模块文件传输的实现主要是在客户端处理,客户端接收到服务器端的文件传输的指令后,采取相应的处理。文件传输主要分两种情况来处理: 1. 单个文件传输理论上单个文件传输相对于整个文件夹的传输要简单的多,服务器端发送指令:winsock1(clientindex).senddata opt_pa & label2.caption,其中opt_pa为单个文件传输的标志,label2.caption为该文件在客户端的绝对路径。客户端分离信息后,根据文件路径取得该文件的长度,先向服务器端发送该文件的长度winsock1.senddata fl_len & lenfile1,目的是为了在文件传输过程中能

31、够判断该文件是否传输完毕。服务器端回送一个ins_tr的确认标志后,客户端开始对该文件进行传输。对文件的传输的具体实现,需要考虑几种情况,对于小型文件可以直接利用winsock传输,但是对于大型文件或视频文件的传输必须采用分割技术来实现,基于以上的考虑,无论是大型文件还是小型的文件的传输首先判断其长度是否大于65535,如果小于则直接传输,否则对该文件进行分块传输(以8k为一个传输块),数据块传输完毕后,还必须考虑所剩下的数据,如果存在剩余的数据也要进行传输。2. 整个文件夹的传输按照常理来说,对于文件夹的传输其实就是对文件的循环传输,原理是:根据服务器端给定的文件夹路径winsock1(cl

32、ientindex).senddata optpa & label2.caption,其中optpa为文件夹传输标志,label2.caption为文件夹的绝对路径,客户端分离路径后首先查找该文件夹下的所有子文件夹和文件的名称,保存在文件中传输到服务器端,在服务器端建立该文件夹及其包含的所有子目录和文件名称,然后客户端循环传输文件。上述中理论上可以实现整个文件夹的传输,但是明显实现起来比较复杂,比如该文件夹下所嵌套的子文件夹比较深,所包含的文件也比较多,那么在传输过程中所要考虑的问题也就非常的复杂,要考虑同级目录中的文件传输和下级文件的传输。经过多次试验后,找到一种替代方法,同样可以是实现整个

33、文件夹的传输,但在原理上有区别于上面的传输途径:主要是利用微软rar.exe和unrar.exe可以简单的实现文件夹的传输。起原理是客户端分离文件夹路径后,调用rar.exe对该文件夹进行压缩处理,这样一来无论文件夹下嵌套有多深,包含了多少个文件,一并作打包处理,然后传输给服务器端;服务器端完全接收该压缩文件到指定路径下,对该压缩文件进行解压缩处理,以此来实现对整个文件夹的传输。无论是单个文件还是整个文件夹的传输,都使用了如图5.4.1-3 所示的流程来传输。5.6 主要功能实现代码分析 1. 服务器端动态添加客户端实现代码:private sub winsock1_connectionreq

34、uest(index as integer, byval requestid as long) if index = 0 then intmax = findopenwinsock 判断列表中是否有存在已断开的winsock控件 winsock1(intmax).accept requestid if findopenwinsockflag = 0 then 无空闲的winsock控件 list3.additem intmax & 号客户端连接成功 else 有空闲控件 list3.removeitem intmax - 1 list3.additem intmax & 号客户端连接成功, i

35、ntmax - 1 findopenwinsockflag = 0 end if winsock1(intmax).senddata cli_id & trim(str(intmax) call refreshcombox 刷新combox列表 end ifend subpublic function findopenwinsock() as integer static localports as integer for x = 0 to winsock1.ubound if winsock1(x).state = 0 then 数组中在空闲的winsock元素 findopenwinsoc

36、k = x findopenwinsockflag = 1 exit function end if next x load winsock1(winsock1.ubound + 1) 不存在直接加载控件元素 localports = localports + 1 winsock1(winsock1.ubound).localport = winsock1(winsock1.ubound - 1).localport + localports findopenwinsock = winsock1.uboundend function2. 文件传输模块代码: public sub transfe

37、r() 核心模块,用以传输 dim freef as integer dim lenfile as long 文件的长度 dim bytdata() as byte 存放数据的数组 dim ipos as long const imax = 65535 freef = freefile 获得空闲的文件号 open filename for binary as #freef 打开文件 doevents lenfile = lof(freef) 获得文件长度if lenfile = (lenfile - imax) 发送整块数据的循环 redim bytdata(1 to imax) get #f

38、reef, ipos + 1, bytdata winsock1.senddata bytdataipos = ipos + imax 移动ipos,使它指向下来要读的数据 loopredim bytdata(1 to lenfile - ipos) 发送剩下的不够一个数据块的数据 get #freef, ipos + 1, bytdata winsock1.senddata bytdata close #freefend sub 这里要注意的是,必须检查文件有没有剩下的数据,如果文件大小正好等于数据块大小的整数倍,那么就没有剩下的数据了。3. 服务器端目录展开和收起 private sub

39、list1_click()dim p as integerfor p = 0 to list1.listcount 1 if list1.selected(p) = true then if judge(p) 0 then 判断有无子目录 ,不等于 0为有子目录 call delete(p) 删除该目录下的所有子目录,达到收起的效果 label2.caption = else 等于 0为无子目录 indexvalue = p winsock1(clientindex).senddata fl_pa_ & filepath & space_num & str(spa) spa = 0 发送该目录

40、的完整路径和空格数到客户端读取 call modify(p, -) 修改该目录的“+”号为“-” label2.caption = filepath end if exit for end ifnext pend subpublic function judge(x as integer) as integer 判断当前选中项是否含有子目录 dim p1 as integer, p2 as integer p1 = len(list1.list(x) - len(trim(list1.list(x) 当前项的空格数 p2 = len(list1.list(x + 1) - len(trim(l

41、ist1.list(x + 1) 当前项的下一项的空格数 if p1 - p2 = 0 or p1 - p2 = 1 then 表示无子目录 judge = 0 p1 - p2 = 1为目录最后一项与其下一项的空格数的情况 end if p1 - p2 = 0为同级目录的空格数的情况 if p2 - p1 = 1 then p2 - p1 = 1为当前目录含有下级目录的空格数的情况 judge = -1 end if if p1 0 and p2 = 0 then judge = 0 表示无子目录 ; end ifend function 4. 客户端对目录的查找 public sub fil

42、edir(mypath as string, spnum as integer) 查找文件夹 if dirflag = 0 then if dir(d:dir.txt) then kill d:dir.txt end if open d:dir.txt for output as #11 else open d:dir.txt for append as #11 end if if right(mypath, 1) then mypath = mypath & end if myname = dir(mypath, vbdirectory) 找寻第一项。 do while myname 开始循

43、环。 if myname . and myname . then 跳过当前的目录及上层目录。 if (getattr(mypath & myname) and vbdirectory) = vbdirectory then 使用位比较来确定 myname 代表一目录。 if flagg = 1 then print #11, re_dir & space(spnum) & + & myname end if 如果它是一个目录,将其名称写入文件。 end if end ifmyname = dir 查找下一个目录。 loopclose #11end subpublic sub filedir1(

44、mypath as string) 查找文件 if dirflag = 0 then if dir(d:file.txt) then kill d:file.txt end if open d:file.txt for output as #110 else open d:dir.txt for append as #110 end if if right(mypath, 1) then mypath = mypath & end if myname = dir(mypath, vbarchive)do while myname 开始循环 if myname . and myname . th

45、en 跳过当前的目录及上层目录 if dirflag = 0 then print #110, re_fle & - & myname else print #110, re_fle & space(filespace) & - & myname end if 如果它是文件格式,将其名称写入文件。 end if myname = dir 查找下一个目录 loopclose #110end sub第六章 典型问题分析6.1 动态添加、删除客户端问题服务器端要想实现点对面的数据通信,必须要解决与客户端之间动态建立连接和断开连接的实际问题。在设计起初我采用的方案是服务器端只要接收到客户端的连接请求,

46、便动态加载一个winsock数组元素,这样可以实现动态与客户端建立连接,当数组中某一个客户端与服务器端断开连接时,服务器端将关闭与该客户端的连接,并在列表中显示该客户端已断开连接,那么当前该winsock数组元素处于空闲状态,如果有新的客户端连接请求到达,服务器端将加载新的winsock数组控件元素与之建立连接。这样,基本上实现了动态添加客户端以及断开客户端。但是这样一来,一旦有客户端与服务器端断开连接,在服务器端的空闲下来的winsock控件数组元素会越来越多,造成系统资源的浪费;经过思考设计后,采取以下方案解决:在服务器端监听到客户端的连接请求时,首先遍历服务器端的winsock控件数组的

47、连接状态,查看是否存在空闲的winsock元素,如果存在,则使用该空闲winsock控件元素与客户端建立连接,否则直接新加载一个winsock数组控件与客户端建立连接。这样一来,可实现有多少个客户端便使用多少个winsock控件数组元素,以致于使得这部分的设计更加合理和人性化。6.2 文件传送和接收问题对于文件的传输,会涉及的问题更广泛一些,比如小型文件的传输、大型文件的传输、各种格式的文件传输等等。在起初设计时,直接使用winsock传输,简单字符串可以实现收发,但是对于图片、音频和视频文件无法实现。在查阅相关的资料后采用数据分割技术来实现对大型文件的传输。具体实现思路如下:以65535的数

48、据大小为一个数据块,如果当前要传输的文件的长度大小在65535以内,则可直接传输;如果大于65535,则以65535为一个传输单位,对该文件进行分割传输,同时不能遗漏所剩余的数据。那么接收方以8192个字节为单位接收二进制的数据块,并存储数据,以此来达到对文件的传输。在整个文件传输过程中,该模块起到了十分重要的作用,无论是大型文件还是小文件的传输均可使用该模块来实现传输。包括各种格式的文件如.doc .xml .wma .mp3等等,因为该模块采用的是以二进制的模式对文件数据进行传输的。6.3 文件夹传输问题在文件夹传输实现中,曾使用过很多方法试图来实现,但都很烦琐,要考虑的方面实在太多,比如

49、已知要抓取的客户端机器上的某个文件夹,一种方法是在客户端遍历该文件夹,建立该文件夹当下的整个目录结构,并回传给服务器端,在服务器端建立好该文件夹的目录结构,然后服务器端指定目录下的文件要求客户端回传,直到该目录中的所有文件传输完毕完毕为止。那么在这个方案中,实施起来真正困难的地方可能是如果该目录下嵌套的子目录非常多,而且包含的文件也很多,那么需要设计一个合理的遍历算法,以便此后对具体文件的传输带来方便。同时好必须十分明确各子目录的等级,否则会造成文件的确传输到了服务器端,但是里面的文件所属目录与客户端完全不一致,这样也就造成了该文件夹的整个目录结构的损坏。考虑以上方案实施起来具有一定的复杂性,

50、我采用了另一种方案,也是本人在偶然的时间发现的一个解决途径,平常我们在发送邮件或从网上下载的软件都是已经经过压缩操作,然后再经过解压缩获得该文件夹。既然如此,在此传输中,我们同样可以利用此原理来实现对整个文件夹的传输。实现的原理如下:客户端得到服务器给定的文件夹的绝对路径后,调用rar.exe对该文件夹实行压缩操作,操作完毕后,将该压缩文件回传到服务器端,服务器接收后,调用unrar.exe对该压缩文件实行解压缩操作,至此实现了对文件夹的传输。采用此方案的有利之处在于无须考虑该文件夹的目录结构,不用考虑该文件到底有多少个嵌套的子目录,以及简化了巧妙的避开了复杂的遍历算法,且与上一种方案相比,传输的准确率也大大提高。6.4 各种命令标志的接收处理问题在整个设计过程中,真正处理的关键还是各种命令标志的处理,无论是客户端还是服务器端都会接收到各种已定义的通信协议(即命令标志),那么存在着一个问题就是如何合理的处理好文件传输和接收,比如服务器端需要抓取客户端机器上的某个文件,那么服务器端发送文件抓取命令+该文件路径,客户端接收并分析命令后,接下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论