急速咨询在线客服

计算机

您如今的地位: > 论文观赏 > 计算机 >

基于多线程的搜集文件传输对象的改进战略

  1 引言
  如今,随着计算机应用的普及,很多人也曾经将进入Internet作为下一个计算机升级的目标,而用Internet停止文件传输,则是计算机联入Internet的一个重要功能之一。是以各类文件传输体系便应运而生,如邮件,聊天对象等。这些软件在应用上各有所长,但与此同时,其本身仍存在缺点和局限性,这些都给文件传输带来了很多不便。起首,对长途办事器的依附招致有些文件传输对象不克不及完全完成点对点的文件传输,乃至对文件的安然形成了威逼。其次,这些传输对象只合适传输体积较小的文件,假设传输的文件体积过大年夜,则会消费很长时间,进而招致资本的浪费,假使搜集速度不睬想,更有能够会招致传输中断。是以,开辟一个功能简单,易于操作,传输效力高的文件传输对象势在必行。
  2 情况与相干开辟技巧
  2.1 Sock搜集编程道理
  套接字(socket)是一种搜集编程接口,实际上就是一个通信端点,供给了发送和接收数据的机制。而Winsock是基于Windows操作体系下的搜集编程接口,也就是基于Socket模型的API。而最简单的一对一的CS构造的通信法式榜样,就只要两个端点,即两个套接字(Socket),一个在Server端,另外一个在Client端,这两个套接字就在CS间建立了双向数据传送的连接。每个套接字都有一个套接字地址,平日是IP和端口的组合。
  Socket分为阻塞形式和非阻塞形式:
  阻塞形式是指在指定套接字上调用函数履行操作时,在没有完成操作之前,函数不会急速前往。例如,办事器法式榜样在阻塞形式下调用accept()函数时将会阻塞办事器线程,直至接收到一个来自客户真个连接请求。默许创建的套接字为阻塞形式。
  非阻塞形式是指在指定套接字上调用函数履行操作时,不管操作能否完成,函数都邑急速前往。例如,在非阻塞形式下调用recv()函数时,法式榜样会直接读取搜集缓冲区中的数据,不管能否读到数据,函数都邑急速前往,而不会一向挂在此函数的调用上。在并发线程模型中,办事器法式榜样中应用了一个线程来等待客户真个连接请求,然后创建新线程与客户端停止通信。由于每个客户端都具有一个专门的通信办事线程,所以可以或许很及时地与办事器法式榜样停止通信,不须要等待其他客户端通信停止。是以本设计采取了socket的非阻塞形式。
  2.2 c/s构造
  C/S (Client/Server)构造,它是一种软件体系体系构造,也就是客户机/办事器构造。它可以充分应用两端硬件情况的优势,将义务公道分派到Client端和Server端来完成。
  C/S构造的基来源基本则是“功能分布”准绳,也就是将计算机应用义务分化成多个子义务,由多台计算机分工完成。客户端完成数据处理,数据表示和用户接口功能;办事器端完成DBMS的核心功能。这类客户请求办事、办事器供给办事的处理方法是一种新型的计算机应用形式。
  如今曾经广泛采取3层C/S构造,与传统的二层构造比拟,三层C/S构造具有以下长处:起首,公道地划分三层构造的功能,从而使全部体系的逻辑构造更加清楚,进步体系和软件的可保护性和可扩大性;其次,可以更灵活地选用照应的平台和硬件体系,应用的各层可以并行开辟或许各自选择最合适的开辟说话。
  3 文件传输对象的设计流程
  3.1 文件传输对象的整体流程
  3.1.1 接收真个启动
  创建监听线程:
  (1)创建Socket,采取非阻塞形式。
  (2)经过过程bind()函数绑定IP地址和端标语。
  (3)经过过程listen()函数使其处于监听状况。
  3.1.2 发送真个连接
  (1)创建Socket。
  (2)经过过程connect()函数向接收端发送连接请求。
  3.2 文件传输对象的详细设计
  3.2.1 发送端
  (1)创建一个连接线程:
  1)创建socket()。
  2)根据用户界面输入的IP地址,调用connect()向接收端收回连接请求。
  3)连接建立后弹出对话框提示连接已建立。
  (2)选定文件后,创建一个对文件停止分包的线程:
  1)自定义一
  个合适的分包大年夜小f_size。
  2)根据file.length取得文件的总大年夜小,经过过程
  file.length/f_size求出该文件的分包数f_number。
  3)经过过程file.
  length%f_size求出该文件最后一包的大年夜小flast_size。
  4)经过过程socket将
  文件根本信息(文件名f_name,文件大年夜小f_size)和文件分包信息(分
  包大年夜小f_size,分包数f_number,最后一包大年夜小flast_size)发送给接收
  端。
  3.2.2 接收端
  在第一个阶段,接收端作为办事器,担任监听客户端提出的连接请求,并且用socket的非阻塞形式。
  (1)创建一个监听线程:
  1)创建socket()。
  2)经过过程WSAEventselect
  ()设置socket为非阻塞形式。
  3)经过过程bing()绑定主机IP地址和端标语。
  4)经过过程listen()使其处于监听形式。
  5)经过过程轮回while(1)
  {SOCKET sockConn=accept(sockSrv,(SOCKADDR*)
  &addrClient,&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持续轮回监听。
  第二部分: s e n d e r 在收回文件信息后, 充当办事器, 监听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 详细完成过程
  源法式榜样的构成: 在本设计中有两个法式榜样, 分别为s e n d e r 和receiver。sender重要有三个部分,一个是senderDlg,用于和用户完成交互。担任在法式榜样运转时创建MonitorImage线程,监听文件缓冲区中的文件状况,别的担任将选中的文件参加文件缓冲区中。同时还会在界面上显示出文件的根本信息和发送状况。第二个是TransImageBuffer,重要用于初始化文件缓冲区,完成文件分包信息的添加和提取。第三个是ImageSender,用于完成文件的分包和发送等。
  receiver中也包含三个部分:一个是r e c e i v e r D l g , 重要担任在法式榜样开端运转时创建MonitorSender线程,监听sender真个连接请求,一旦监听到连接请求,则急速照应,以后轮回监听。别的会及时显示文件的根本信息和接收状况。第二个是TransImageBuffer,异样是用于初始化文件缓冲区,完成文件分包的添加和提取等。第三个是ImageReceiver,用于完成文件的分块接收和文件存储等6 总结
  在编程之前,起重要对全部体系有一个很好的懂得,关于体系的功能和需求分析透辟以后,应用软件工程的思维,公道的停止开辟设计。