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

文件传输工具  时间: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总结

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

VirMach(8元/月)KVM VPS,北美、欧洲

VirMach,成立于2014年的美国IDC商家,知名的低价便宜VPS销售商,支持支付宝、微信、PayPal等方式付款购买,主打美国、欧洲暑假中心产品,拥有包括洛杉矶、西雅图、圣何塞、凤凰城在内的11个数据中心可以选择,可以自由搭配1Gbps、2Gbps、10Gbps带宽端口,有Voxility DDoS高防IP可以选择(500Gbps以上的防御能力),并且支持在控制面板付费切换机房和更换IP(带...

TabbyCloud周年庆&七夕节活动 美國INAP 香港CN2

TabbyCloud迎来一周岁的生日啦!在这一年里,感谢您包容我们的不足和缺点,在您的理解与建议下我们也在不断改变与成长。为庆祝TabbyCloud运营一周年和七夕节,TabbyCloud推出以下活动。TabbyCloud周年庆&七夕节活动官方网站:https://tabbycloud.com/香港CN2: https://tabbycloud.com/cart.php?gid=16购买链...

spinservers:圣何塞物理机7.5折,$111/月,2*e5-2630Lv3/64G内存/2T SSD/10Gbps带宽

spinservers美国圣何塞机房的独立服务器补货120台,默认接入10Gbps带宽,给你超高配置,这价格目前来看好像真的是无敌手,而且可以做到下单后30分钟内交货,都是预先部署好了的。每一台机器用户都可以在后台自行安装、重装、重启、关机操作,无需人工参与! 官方网站:https://www.spinservers.com 比特币、信用卡、PayPal、支付宝、webmoney、Payssi...

文件传输工具为你推荐
国内ip代理全国各省代理IP域名购买为什么要购买域名,域名是干嘛用的?免费网站空间如何免费做网站 免费域名+免费空间+免费网站重庆网站空间重庆有没有发展空间?免备案虚拟主机哪家免备案虚拟主机好,而且便宜点的?虚拟主机是什么什么是虚拟主机?虚拟主机服务商哪个虚拟主机的服务商比较好?大连虚拟主机大连哪些地方的网通机房好?虚拟主机mysql虚拟主机的数据库有哪些asp虚拟主机支持ASP MSSQL 的虚拟主机有哪些推荐
已备案域名注册 新通用顶级域名 香港vps99idc 电影服务器 腾讯云数据库 info域名 xfce 国外网站代理服务器 gg广告 个人域名 申请个人网站 linux服务器维护 ftp免费空间 四核服务器 linux使用教程 超级服务器 新睿云 google台湾 工信部icp备案查询 godaddy空间 更多