分包基于多线程的网络文件传输工具的改进

文件传输工具  时间:2021-01-12  阅读:()

基于多线程的网络文件传输工具的改进

摘要随着计算机技术的迅猛发展人们通过Internet 进行学习工作在此过程中文件传输成为了最常用的服务之一。而多线程文件传输可以有效地提高文件的传输速度和传输效率。本次设计的文件传输工具是在Windows操作系统下于Visual Studio 2012环境中用WinSock控件实现的是基于TCP/IP协议的C/S模式在服务器和客户端分别以Socket为中心进行编程其中服务器端和客户端的界面设计采用Windows MFC框架分别有文件发送模块和文件接收模块。该设计成功的实现了服务器和客户端的文件。成功的实现了服务器和客户端的文件传输。

关键词C/S结构点对点Socket连接多线程多种格式的文件

中图分类号 tp393文献标识码A文章编号

1007-9416201504-0061-02

1 引言

如今随着计算机应用的普及许多人也已经将进入Internet作为下一个计算机升级的目标而用Internet进行文件传输则是计算机联入Internet的一个重要功能之一。因此各种文件传输系统便应运而生如邮件聊天工具等。

这些软件在使用上各有所长但与此同时其自身仍存在缺点和局限性这些都给文件传输带来了很多不便。首先对远程服务器的依赖导致有些文件传输工具不能完全实现点对点的文件传输甚至对文件的安全造成了威胁。其次这些传输工具只适宜传输体积较小的文件如果传输的文件体积过大则会耗费很长时间进而导致资源的浪费倘若网络速度不理想更有可能会导致传输中断。 因此开发一个功能简单易于操作传输效率高的文件传输工具势在必行。

2环境与相关开发技术

2.1 Sock网络编程原理

套接字socket 是一种网络编程接口 实际上就是一个通信端点提供了发送和接收数据的机制。而Winsock是基于Windows操作系统下的网络编程接口也就是基于Socket模型的API。而最简单的一对一的CS结构的通信程序就只有两个端点即两个套接字Socket  一个在Server 端另一个在Cl ient端这两个套接字就在CS间建立了双向数据传送的连接。每个套接字都有一个套接字地址通常是IP和端口的组合。

Socket分为阻塞模式和非阻塞模式

阻塞模式是指在指定套接字上调用函数执行操作时在没有完成操作之前函数不会立即返回。例如服务器程序在阻塞模式下调用accept  函数时将会阻塞服务器线程

直至接收到一个来自客户端的连接请求。默认创建的套接字为阻塞模式。

非阻塞模式是指在指定套接字上调用函数执行操作时无论操作是否完成函数都会立即返回。例如在非阻塞模式下调用recv 函数时程序会直接读取网络缓冲区中的数据无论是否读到数据函数都会立即返回而不会一直挂在此函数的调用上。在并发线程模型中服务器程序中使用了一个线程来等待客户端的连接请求然后创建新线程与客户端进行通信。因为每个客户端都拥有一个专门的通信服务线程所以能够很及时地与服务器程序进行通信不需要等待其他客户端通信结束。因此本设计采用了socket的非阻塞模式。

2.2c/s结构

C/S Cl ient/Server 结构它是一种软件系统体系结构也就是客户机/服务器结构。它可以充分利用两端硬件环境的优势将任务合理分配到Cl ient端和Server端来实现。

C/S结构的基本原则是“功能分布”原则也就是将计算机应用任务分解成多个子任务由多台计算机分工完成。客户端完成数据处理数据表示以及用户接口功能服务器端完成DBMS的核心功能。这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式。

现在已经普遍采用3层C/S结构与传统的二层结构相

比三层C/S结构具有以下优点首先合理地划分三层结构的功能从而使整个系统的逻辑结构更为清晰提高系统和软件的可维护性和可扩展性其次可以更灵活地选用相应的平台和硬件系统应用的各层可以并行开发或者各自选择最适合的开发语言。

3文件传输工具的设计流程

3.1文件传输工具的总体流程

3.1 .1接收端的启动

创建监听线程

 1 创建Socket 采用非阻塞模式。

2通过bind  函数绑定IP地址和端口号。

3通过l isten  函数使其处于监听状态。

3.1 .2发送端的连接

 1 创建Socket。

2通过connect  函数向接收端发送连接请求。

3.2文件传输工具的具体设计

3.2.1发送端

 1 创建一个连接线程 1 创建socket  。 2根据用户界面输入的IP地址调用connect  向接收端发出连接请求。 3 连接建立后弹出对话框提示连接已建立。

2选定文件后创建一个对文件进行分包的线程 1 自定义一个合适的分包大小f_size。 2 根据fi le. length得到

文件的总大小通过fi le. length/f_size求出该文件的分包数f_number。 3通过fi le. length%f_size求出该文件最后一包的大小flast_size。 4通过socket将文件基本信息文件名f_name 文件大小f_size和文件分包信息分包大小f_size 分包数f_number 最后一包大小flast_size发送给接收端。

3创建一个发送文件数据的线程sendThread  

{

WaitForMultipleEvents   recv   //接收分包信息fs e e k   //通过该函数将指针定位包信息所指的位置send    //发送分包数据

}

3.2.2接收端

在第一个阶段接收端作为服务器负责监听客户端提出的连接请求并且用socket的非阻塞模式。

 1 创建一个监听线程 1 创建socket  。 2通过WSAEventselect  设置socket为非阻塞模式。 3通过bing  绑定主机IP地址和端口号。 4通过l isten  使其处于监听模式。 5通过循环whi le  1 

{SOCKET sockConn=accept sockSrv 

SOCKADDR* &addrCl ient &len   }

使得发送端提出的连接请求能够被马上响应并且新创建一个socket与发送端进行通信。

注监听线程始终开启知道程序结束时才退出全程监听发送端的连接请求。

2创建一个接收文件信息的线程

以步骤1中新创建的socket为该线程参数通过调用recv 接收发送端发送的文件基本信息并将文件名文件大小显示在界面上。

3当接收端接收到该文件的基本信息后创建一个函数用来做接收文件的准备工作。

4创建一个接收文件数据线程。

5创建一个函数判断文件是否接收完全。

4主要实现技术

4.1文件的分块

网络应用程序是一种在不同系统的进程间通过网络通信协议进行的进程间的通信问题。在Windows编程中是通过套接字socket来编程的 socket分为阻塞模式和非阻塞模式本设计为了提高数据的传输效率采用了socket的非阻塞模式。当文件数据很大时使用套接字socket进行传输往往需要花费较长的时间容易出错因此我们将把文件分为N块进行数据的分块传输。

4.2文件的分块传输

在传统算法中sender将主动把分包后的数据块依次传送至receiver 而receiver只负责接收但是由于sender 并不能保证发送的数据块receiver都已正确接收所以需receiver发送确认信号从而影响传输效率。 因此在本设计中receiver将主动向sender索要分包数据而sender只需按接收到的分包信息发送相应的分包数据即可直至receiver发送接收完毕信息为止。 因此此次设计将分为两大部分。

第一部分 receiver作为服务器 sender作为客户端。receiver创建socket后则处于监听状态当sender发现有文件需要传输时则首先向receiver提出连接请求 receiver 监听到sender提出的连接请求后马上响应并创建新的socket与sender进行通信。连接成功建立后 sender向receiver发送文件的基本信息包括分包信息 而receiver 继续循环监听。

第二部分sender在发出文件信息后充当服务器监听receiver。 receiver接收到文件信息后创建socket主动向sender发送分包信息索要分包数据而sender接收到分包信息后将其解析并发送相应的分包数据。直至receiver检测到所有分包数据都已接收向sender发送结束信息。

4.3确认所有分包都已接收

为解决这个问题将自定义一个分包信息结构体其中

包括分包ID分包大小以及分包的接收状态0 未接收

1 正在接收2 已接受。在sender进行文件分包时会初始化文件信息其中包括记录文件的分包数分包的固定大小及最后一个分包的大小。同时也会初始化每个分包信息。receiver在接收到文件信息之后根据文件信息中提供的分包数申请等大的分包信息缓存区。并初始化每个分包的接收状态为0 表示尚未接收。当receiver取得分包ID并向sender发送时修改此分包的接收状态为1 表示正在接收。当receiver正确接收此分包后修改分包接收状态为2 表示已接收。当receiver判断所有分包的接收状态都为2时即表示所有分包都已接收。

4.4多线程文件传输

一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片可以用尽可能少的时间来对用户的要求做出响应使得进程的整体运行效率得到较大提高同时增强了应用程序的灵活性。

由于本设计采用的是Socket的非阻塞模式采用多线程可提高cpu利用率。于是在文件的传输过程中创建了3个线程同时接收文件分包数据创建线程后一个应用程序可以同时有多个线程一起访问因此在设计中用了大

量的信号量和事件机制以避免访存冲突。

5具体实现过程

源程序的组成在本设计中有两个程序分别为sender 和receiver。sender主要有三个部分一个是senderDlg 用于和用户实现交互。负责在程序运行时创建MonitorImage线程监听文件缓冲区中的文件状况另外负责将选中的文件加入文件缓冲区中。同时还会在界面上显示出文件的基本信息以及发送状态。第二个是TransImageBuffer 主要用于初始化文件缓冲区实现文件分包信息的添加和提取。第三个是ImageSender 用于实现文件的分包以及发送等。receiver中也包括三个部分

一个是receiverDlg 主要负责在程序开始运行时创建MonitorSender线程监听sender端的连接请求一旦监听到连接请求则立即响应之后循环监听。另外会实时显示文件的基本信息以及接收状态。

第二个是TransImageBuffer 同样是用于初始化文件缓冲区实现文件分包的添加和提取等。第三个是

ImageReceiver 用于实现文件的分块接收以及文件存储等

6总结

在编程之前首先要对整个系统有一个很好的理解对于系统的功能和需求分析透彻之后利用软件工程的思想

Vultr VPS新增第18个数据中心 瑞典斯德哥尔摩欧洲VPS主机机房

前几天还在和做外贸业务的网友聊着有哪些欧洲机房的云服务器、VPS商家值得选择的。其中介绍他选择的还是我们熟悉的Vultr VPS服务商,拥有比较多达到17个数据中心,这不今天在登录VULTR商家的时候看到消息又新增一个新的机房。这算是第18个数据中心,也是欧洲VPS主机,地区是瑞典斯德哥尔摩。如果我们有需要欧洲机房的朋友现在就可以看到开通的机房中有可以选择瑞典机房。目前欧洲已经有五个机房可以选择,...

青果云(590元/年),美国vps洛杉矶CN2 GIA主机测评 1核1G 10M

青果网络QG.NET定位为高效多云管理服务商,已拥有工信部颁发的全网云计算/CDN/IDC/ISP/IP-VPN等多项资质,是CNNIC/APNIC联盟的成员之一,2019年荣获国家高薪技术企业、福建省省级高新技术企业双项荣誉。那么青果网络作为国内主流的IDC厂商之一,那么其旗下美国洛杉矶CN2 GIA线路云服务器到底怎么样?官方网站:https://www.qg.net/CPU内存系统盘流量宽带...

LiCloud:香港CMI/香港CN2+BGP服务器,30Mbps,$39.99/月;香港KVM VPS仅$6.99/月

licloud怎么样?licloud目前提供香港cmi服务器及香港CN2+BGP服务器/E3-1230v2/16GB内存/240GB SSD硬盘/不限流量/30Mbps带宽,$39.99/月。licloud 成立於2021年,是香港LiCloud Limited(CR No.3013909)旗下的品牌,主要提供香港kvm vps,分为精简网络和高级网络A、高级网络B,现在精简网络和高级网络A。现在...

文件传输工具为你推荐
美国主机空间求速度快稳定好的美国主机空间空间租用网站空间申请是免费的吗?还有就是使用租用空间,这种便宜空间好使吗?空间租用租用空间多少钱 1MB?vpsVPS是什么?jsp虚拟空间JSP虚拟目录及虚拟路径的配置方法网站空间价格1M网站空间是多少钱apache虚拟主机用的apache配置的虚拟主机,只有第一个能打开,别的是一直等待到超时,但是在服务器能正常打开。windows虚拟主机在windows上怎么安装虚拟机长沙虚拟主机在长沙,哪个兼职网站最最可靠??中文域名英文域名和中文域名是什么意思?
cybermonday buyvm yardvps wdcp win8.1企业版升级win10 远程登陆工具 cn3 网通服务器托管 100mbps 国外ip加速器 Updog 吉林铁通 跟踪路由命令 带宽租赁 美国凤凰城 路由跟踪 下载速度测试 免费ftp 论坛主机 申请免费空间 更多