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

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

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

HostYun:联通AS9929线路,最低月付18元起,最高500Mbps带宽,洛杉矶机房

最近AS9929线路比较火,联通A网,对标电信CN2,HostYun也推出了走联通AS9929线路的VPS主机,基于KVM架构,开设在洛杉矶机房,采用SSD硬盘,分为入门和高带宽型,最高提供500Mbps带宽,可使用9折优惠码,最低每月仅18元起。这是一家成立于2008年的VPS主机品牌,原主机分享组织(hostshare.cn),商家以提供低端廉价VPS产品而广为人知,是小成本投入学习练手首选。...

酷番云78元台湾精品CN2 2核 1G 60G SSD硬盘

酷番云怎么样?酷番云就不讲太多了,介绍过很多次,老牌商家完事,最近有不少小伙伴,一直问我台湾VPS,比较难找好的商家,台湾VPS本来就比较少,也介绍了不少商家,线路都不是很好,有些需求支持Windows是比较少的,这里我们就给大家测评下 酷番云的台湾VPS,支持多个版本Linux和Windows操作系统,提供了CN2线路,并且还是原生IP,更惊喜的是提供的是无限流量。有需求的可以试试。可以看到回程...

PacificRack:洛杉矶KVM月付1.5美元起,1G内存套餐年付12美元起

PacificRack在本月发布了几款特价产品,其中最低款支持月付仅1.5美元,基于KVM架构,洛杉矶机房,PR-M系列。PacificRack简称PR,QN机房旗下站点,主要提供低价VPS主机产品,基于KVM架构,数据中心为自营洛杉矶机房,现在只有PR-M一个系列,分为了2个类别:常规(Elastic Compute Service)和多IP产品(Multi IP Server)。下面列出几款秒...

文件传输工具为你推荐
云主机租用云主机到底是什么?租用以后该如何使用?域名注册商中国十大域名注册商海外主机租用国外服务器租用有几十块钱一年的么中文域名注册查询如何注册中文域名?请问个人怎样注册中文域名。cn的,个人注册别人公司的可以吗?违法吗?或者怎样才能注册虚拟主机代理虚拟主机代理哪家好,应该选择哪个家?国内免费空间免费空间哪个好用空间域名空间和域名是什么?网站域名空间哪个网站的域名空间的便宜?网站域名空间网站域名和空间域名备案域名怎么进行备案?
花生壳域名 大庆服务器租用 主机优惠码 qq云存储 dreamhost la域名 softbank官网 免费cdn加速 免费名片模板 发包服务器 百兆独享 双线主机 ftp免费空间 1美金 中国电信宽带测速器 创建邮箱 太原联通测速 游戏服务器出租 lamp怎么读 睿云 更多