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

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

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

蓝速数据(58/年)秒杀服务器独立1核2G 1M

蓝速数据金秋上云季2G58/年怎么样?蓝速数据物理机拼团0元购劲爆?蓝速数据服务器秒杀爆产品好不好?蓝速数据是广州五联科技信息有限公司旗下品牌云计算平台、采用国内首选Zkeys公有云建设多种开通方式、具有IDC、ISP从业资格证IDC运营商新老用户值得信赖的商家。我司主要从事内地的枣庄、宿迁、深圳、绍兴、成都(市、县)。待开放地区:北京、广州、十堰、西安、镇江(市、县)。等地区数据中心业务,均KV...

星梦云60元夏日促销,四川100G高防4H4G10M,西南高防月付特价

星梦云怎么样?星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器 。官方网站:点击访问星梦云官网活动方案:1、成都电信年中活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路4vCPU4G40G+50...

RackNerd:特价美国服务器促销,高配低价,美国多机房可选择,双E526**+AMD3700+NVMe

racknerd怎么样?racknerd今天发布了几款美国特价独立服务器的促销,本次商家主推高配置的服务器,各个配置给的都比较高,有Intel和AMD两种,硬盘也有NVMe和SSD等多咱组合可以选择,机房目前有夏洛特、洛杉矶、犹他州可以选择,性价比很高,有需要独服的朋友可以看看。点击进入:racknerd官方网站RackNerd暑假独服促销:CPU:双E5-2680v3 (24核心,48线程)内存...

文件传输工具为你推荐
国际域名注册如何申请国际域名注册广东虚拟主机大家推荐一下广东地区稳定的IDC已备案域名查询如何查询已备案域名是不是万网/阿里云接入的备案中文域名注册查询如何注册中文域名?请问个人怎样注册中文域名。cn的,个人注册别人公司的可以吗?违法吗?或者怎样才能注册国外虚拟空间哪里买的100m海外虚拟空间便宜稳定?代理主机主机做成代理服务器,其他局域网内的电脑必须通过我的这个网络出去虚拟空间哪个好虚拟内存一般设多大比较好?北京网站空间什么样的网站空间好虚拟主机评测网请问这几个哪个虚拟主机好虚拟主机评测浅谈建站新手如何挑选虚拟主机
华众虚拟主机管理系统 国外vps租用 三级域名网站 美国主机评测 国外主机 bluevm windows主机 彩虹ip 500m空间 777te 100x100头像 howfile 135邮箱 免费防火墙 爱奇艺vip免费试用7天 电信托管 raid10 香港亚马逊 跟踪路由命令 空间登录首页 更多