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

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

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

CYUN(29元/月)美国、香港、台湾、日本、韩国CN2,续费原价

关于CYUN商家在之前有介绍过一次,CYUN是香港蓝米数据有限公司旗下的云计算服务品牌,和蓝米云、蓝米主机等同属该公司。商家主要是为个人开发者用户、中小型、大型企业用户提供一站式核心网络云端部署服务,促使用户云端部署化简为零,轻松快捷运用云计算。目前,CYUN主要运营美国、香港、台湾、日本、韩国CN2线路产品,包括云服务器、站群服务器和独立服务器等。这次看到CYUN夏季优惠活动发布了,依然是熟悉的...

数脉科技:阿里云香港CN2线路服务器;E3-1230v2/16G/240G SSD/10Mbps/3IP,月付374元

数脉科技怎么样?昨天看到数脉科技发布了7月优惠,如果你想购买香港服务器,可以看看他家的产品,性价比还是非常高的。数脉科技对香港自营机房的香港服务器进行超低价促销,可选择10M、30M的优质bgp网络。目前商家有优质BGP、CN2、阿里云线路,国内用户用来做站非常不错,目前E3/16GB阿里云CN2线路的套餐有一个立减400元的优惠,有需要的朋友可以看看。点击进入:数脉科技商家官方网站香港特价阿里云...

如何低价香港服务器购买?有没有便宜的香港服务器推荐?

如何低价香港服务器购买?想要做一个个人博客,想用香港服务器,避免繁琐备案,性能不需要多高,只是记录一些日常而已,也没啥视频之类的东西,想问问各位大佬有没有低价的香港服务器推荐?香港距大陆近,相比美国服务器最大的优势在于延迟低,ping值低,但是带宽紧张,普遍都是1M,一般戏称其为“毛细血管”。同时价格普遍高,优质稳定的一般价格不菲。大厂云梯队阿里云、腾讯云两家都有香港服务器,要注意的是尽量不要选择...

文件传输工具为你推荐
租用虚拟主机虚拟主机和租用服务器有什么区别?国内域名注册国内最好的域名注册服务机构?美国主机租用美国服务器多少钱一年?企业虚拟主机一般的企业应该用什么样的虚拟主机?注册国际域名哪里的国际域名注册便宜?asp主机空间asp空间是什么域名购买在网上购买域名 会受骗吗北京网站空间网站空间哪里的好,韩国虚拟主机香港和韩国的虚拟主机哪个比较好?重庆虚拟主机万网M3型虚拟主机怎么样?速度如何?
游戏服务器租用 北京vps主机 百度云100as patcha 150邮箱 空间出租 申请个人网站 百兆独享 工作站服务器 135邮箱 adroit 免费dns解析 视频服务器是什么 韩国代理ip 国外的代理服务器 防cc攻击 徐州电信 可外链的相册 阿里dns netvigator 更多