文件传输系统设计文档

文件传输系统设计文档

 

1引言. 2

1.1编写目的... 2

1.2背景... 2

1.3部分用到的词定义... 2

2程序详细设计. 3

2.1程序描述... 3

2.2功能... 3

2.3性能... 10

2.4模块划分... 10

2.5程序系统的结构... 11

2.5.1串行化的传输. 11

2.5.2并行的传输. 11

2.5.3SOCKET类的封装. 12

2.5.4SOCKET的TCP连接流程图. 12

2.5.5服务器端数据流图.. 13

2.5.6客户端数据流图.. 14

2.6接口/类具体设计. 16

2.7任务分配... 18

2.8尚未解决的问题... 18

2.9 BUG记录... 18

 


1引言

1.1编写目

按照公司布置的实习任务,实现文件传输系统,并完成代码的撰写,在编写代码的过程中,对学过的专业知识进行回顾,加强编写代码的能力和逻辑思维能力,初步掌握C++网络编程原理。在撰写设计文档的过程中,对一个项目的设计开发过程进行梳理,熟悉设计文档编写的规范和要求,为今后项目开发打下坚实的基础。

1.2背景

    该项目是在Visual C++MFC进行的开发,要求对C++语言熟练的掌握,系统的开发涉及到网络原理的SOCKET编程和操作系统的多线程编程技术。文件传输功能成为现在流行的即时通信工具不可少的一部分。要实现一个功能较完善的文件传输工具,若只能实现文件的发送与接收,显然是不够的。本文开发的文件传输工具,通过使用多线程、自定义的传输命令等技巧,实现了多个用户之间并发传输多个文件,并可以在传输过程进行简单交互的功能。

1.3部分用到的词定义

    Socket:通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

CSocket:是MFCWindows Socket编程的类的封装,其派生于CAsyncSocket类,即是CAsyncSocket类的更抽象的封装,用该类来完成Socket编程将更方便。

串行化:将对象存储到介质(如文件、内在缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节byte数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。

TCPTransmission Control Protocol 传输控制协议,是一种面向连接的、可靠的、基于字节流的运输层通信协议。

多线程为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

2程序详细设计

2.1程序描述

2.1.1 利用socket进行TCP连接

   文件传输系统包括一个服务器端和一个客户端。接收方是TCP的服务器端,发送方是TCP的客户端。

2.1.2 同步的多线程传输方式

   要实现并行传输,即服务器端可以同时接收几个客户端发送的文件,我们采用了同步的多线程方式,在程序中有两类线程:接收线程和发送线程,其中监听线程在接收端,发送线程在发送端。

2.1.3发送端与接收端的交互

   a.发送端询问接收端,是否同意接收文件以及接收端的应答。

   b.在传输过程中发送端取消文件发送。

   c.在传输过程中接收方取消文件接收。

2.2功能

1. 文件在传输过程时应不影响用户界面其它的操作;

2. 在正式传输文件前,发送方应先发送请求,接收方可以同意或拒绝文件发送,接收方同意后才能进行传输;

3. 客户端在文件传输过程中,可以显示文件的信息,如文件名,保存路径,文件大小;以及显示传输进度,如完成的百分比,速度;

4. 文件在传输过程中接收方和发送方都可以取消文件传输过程;

5. 可以多个客户端同时向服务器并行发送文件;

6.传输过程中,服务器端和客户端可以进行对话。

 

l  功能界面图:

1-1客户端操作界面

1-2服务器操作界面

 

 

 

 

 

 

 

l  客户端的用例图:

 

1-3 客户端用例图

 

客户端用例描述:

用例1:连接

参与者:  客户端用户

前置条件:1、启动Client.exe

          2、设置好正确的IP地址和端口

后置条件:与服务器端建立连接 

触发条件:点击连接

正常流程:1、创建客户端套接字

          2、与服务器建立连接

          3、初始化套接字 

异常流程:1IP地址为空,提示IP地址不能为空

          2、客户端连接套接字创建失败,消息对话框提示

          3、客户端连接套接字连接失败,消息对话框提示

          4、服务器的问题,消息对话框提示

  •  
    •  
      • 初始化错误
      • 对方没有启动
      • 对方已经关闭
      • 连接的尝试被拒绝
      • 在一个非套接字上尝试了一个操作
      • 特定的地址已在使用中
      • 与主机的连接被关闭 
      • 一般性错误          

 

用例2:断开

参与者:客户端用户 

前置条件:与服务器端连接 

后置条件:与服务器端断开连接

触发条件:点击断开

正常流程:1、告诉服务器连接被断开

              2、关闭客户端套接字

              3、弹出消息对话框,断开

异常流程:

 

 

用例3:浏览文件

参与者:客户端用户

前置条件:启动Client.exe

后置条件:1、显示文件路径

              2、显示文件大小

触发条件:点击浏览文件

正常流程:1、选择文件

             2、获取文件路径,文件名

             3、打开文件

             4、获取文件大小

             5关闭文件 

异常流程:

 

 

用例4:发送

参与者:客户端用户

前置条件: 1、已连接到服务器端

               2、已经选定文件 

后置条件:将文件发送到服务器端

触发条件:点击发送

正常流程: 1、向服务器发送文件名和文件大小,请求发送

           2、当对方同意且准备好接收文件时,启动文件发送线程

           3、发送文件

异常流程: 1、连接的请求被拒绝

               2、服务器已经关闭了连接,提示对方已关闭

               3、发送文件的请求被拒绝,提示

               4、对方取消了发送 

 

 

 

用例5:取消发送

参与者:客户端用户

前置条件:文件正在发送中 

后置条件:发送过程被取消

触发条件:点击“取消”

正常流程:1、弹出“取消确认”对话框

          2、进入扩展用例1

 

 

 

用例6:退出

参与者:客户端用户

前置条件: client.exe在运行过程中

后置条件:弹出“取消确认”对话框

触发条件:点击“退出”

正常流程:1、弹出“退出确认”对话框

          2、进入扩展用例2

异常流程:        

 

 

用例7:聊天

参与者:客户端用户

前置条件: client.exe在运行过程中

后置条件: 信息发送到服务器端

触发条件: 按回车键,或点击“发送”

正常流程: 1、在“text”上输入信息

           2、按回车键,或点击“发送”         

异常流程:        

 

 

扩展用例1:取消确认

参与者:客户端用户

前置条件:点击“取消”

前置条件: 点击“取消”

后置条件: 1、确认取消,停止传输文件,告诉对方发送被取消

           2、不取消,则返回继续传输

触发条件:点击“取消确认”

正常流程:若确认取消

异常流程     

 

 

扩展用例2:退出确认

参与者: 客户端用户

前置条件: 点击“退出”

后置条件: 1、确认退出,停止传输文件

           2、不退出,则返回程序中

触发条件:点击“退出确认”

正常流程:1、如果正在文件传输过程中,弹出信息提示“请先停止传送后再退出

          2、断开连接

          3、消除对话框

       

 

 

l  服务器端用例图:

 

                  1-4 服务器用例图

 

服务器用例描述:

用例1:启动

参与者: 服务器端用户

前置条件: 运行server.exe

后置条件: 对客户端进行监听

触发条件:点击“启动”

正常流程:1、创建客户端连接字CCListenSocket

          2、监听客户端连接

异常流程:        

 

用例2:关闭

参与者: 服务器用户

前置条件:监听客户端

后置条件:关闭服务器套接字

触发条件:点击“关闭”

正常流程:关闭服务器套接字

异常流程:        

 

用例3:取消

参与者:服务器用户

前置条件:文件在传输过程中

后置条件:文件停止传输

触发条件:点击“取消”

正常流程:1、弹出“取消确认”对话框

          2、进入扩展用例1

异常流程:       

 

用例4:退出

参与者: 服务器端用户

前置条件:运行server.exe

后置条件:弹出“取消确认”对话框

触发条件:点击“退出”

正常流程:1、弹出“退出确认”对话框

          2、进入扩展用例2

异常流程:        

 

用例5: 聊天

参与者: 服务器端用户

前置条件:运行server.exe

后置条件:向服务器端群发消息

触发条件:输入“回车”,或点击“发送”

正常流程:1、在“text”中输入信息

          2、输入“回车”,或点击“发送”

异常流程:        

 

 

扩展用例1:取消确认

参与者: 服务器端用户

前置条件: 点击“取消”

后置条件: 1、确认取消,停止传输文件,告诉对方发送被取消

           2、不取消,则返回继续传输

触发条件:点击“取消确认”

正常流程:若确认取消

异常流程:        

 

扩展用例2: 退出确认

参与者:服务器端用户

前置条件: 点击“退出”

后置条件: 1、确认退出,停止传输文件

           2、不退出,则返回程序中

触发条件:点击“退出确认”

正常流程: 1、如果正在文件传输过程中,弹出信息提示“请先停止传送后再退出

           2、断开连接

           3、消除对话框

 

异常流程:        

 

2.3性能

 1、可传输大型文件,大于50M

2、客户端在传输大型文件的同时,还可与服务器端进行会话

3、一个服务器端可以接收多个客户端的并发传输

4、多客户端进行并行传输时速度达到每秒1M左右

2.4模块划分

    在用例图中已进行分析。

2.5程序系统的结构

    这个程序所采用的是基于TCP/IP协议的Winsock编程原理,这种编程模型一般都是采用客户机/服务器Client/Server方式,在这个程序里面也正是采用这种基本的方法。
     
在通信的时候主要可以分为两个部分,一个部分是用于传送控制信息,例如发送文件的请求,文件的名称、大小等,由于这方面的数据量比较小,为了方便起见我采用了MFC所提供的CSocket类的串行化技术来实现;而另一个部分就是文件的传输部分,对于文件的传输,由于数据量相对来说比较大,所以我分别写了两个线程,一个用于发送,一个用于接收。这两个部分在具体实现的时候分别建立有自己的套接字Socket

2.5.1串行化的传输

   程序传送控制信息的时候采用的是CSocket类的串行化技术,这样一来使得发送和接收网络数据就像普通的数据串行化一样简单。封装一个可以串行化的消息类,消息的发送和接收只需使用流操作符对缓冲区进行存取就可以了。根据程序的需要,对消息类的CMessage的构造函数进行了重载,CMessage()为默认的构造函数,如果只是发送一般的控制信息我们可以使用CMessage(int nType)构造函数,当需要发送文件名及客户端的编号的时候我们可以使用CMessage(int nType, CString strFileName, DWORD nCount)构造函数,

2.5.2并行的传输

要实现并行传输,即服务器端可以同时接收几个客户端发送的文件,我们采用了同步的多线程方式,在程序中主要有两类线程:_SendThread(发送线程)和_ListenThread(接收线程)。在发送线程中实现了创建客户端套接字,连接服务器端,调用主对话框类中的SendFile成员函数进行文件的发送;在接收线程中实现了创建服务器端套接字,对客户端进行监听,向主对话框发送一个自定义消息WM_ACCEPT_TRANSFERS,发送一个信息告诉发送方可以开始发送文件,接受连接,调用主对话框类中的ReceiveFile成员函数进行文件的接受。

2.5.3 SOCKET类的封装

服务器端:

1.        CListenSocket

CListenSocket是负责监听管理的套接字类;CListenSocket(CFileTransfersDlg* pdlgMain)为重载的构造函数;m_pdlgMain为指向主对话框类CServerDlg的指针。重载基类CsocketOnAccept函数以使对来自客户的连接请求作出响应, 当该套接字接收到客户的连接请求时,就调用CServerDlg对象的ProcessAccept()函数进行处理。

2.        CTransferSocket

CTransferSocket是负责初始化、传送与接收串行化消息的类,继承于CSocket参数m_pFile为一个CSocketFile类型的指针用于连接到一个CSocket对象;m_pArchiveInm_pArchiveOut均为CArchive类型的指针,分别用于接受和发送。该类重写了CSocket中的OnReceive函数,当有消息在Carchive对象提供的缓冲区中,CTransferSocket自动调用OnReceive函数,用以处理客户端发送过来的消息。Init成员函数用于串行化的初始化,Abort成员函数用于对m_pArchiveOut指针进行释放,SendMsg成员函数用于发送信息,ReceiveMsg成员函数用于接受信息。

客户端:

1.        CClientSocket

CClientSocket作用与服务器端的CTransferSocket类作用基本相同,OnReceive函数实现有所不同。

2.5.4  SOCKETTCP连接流程图 

2-1 服务器与客户端连接流程图

 

 

 

 

2.5.5服务器端数据流图

2-2 服务器端数据流图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.5.6客户端数据流图

 

2-3 客户端数据流图

 

 

 

 

 

 

 

 

 

 

 

 

 

2.6接口/类具体设计

l  文件传输过程的交互图

 

2-4 文件传输交互图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l  类图设计

 

 

 

 

 

 

2.7任务分配

代码部分:

施余主要负责服务器端的开发,张一负责客户端的开发

设计文挡部分:

张一负责整个文档的初稿,施余负责后期的修改

2.8尚未解决的问题

1、传输速率有待进一步提高,可以将一个文件拆分成多个数据包进行多线

程传输。

2服务器无法定向中止某一个客户端传输文件,只能终止所有客户端的文件传输

2.9 BUG记录

序号

Bug描述

原因

解决方法

1

多个客户端连接服务器后,最后一个连接的客户端可以发送文件,之前连接的客户端无法发送文件

服务器端保存的客户 socket为最后一个申请连接的客户端

服务器给每个连接的客户端一个编号,并把每个服务器accpet到的客户端socket放入链表

2

多个客户端连接服务器,服务器无法向所有客户端群发消息

原因同序号1

循环保存所有客户端socket的链表,向每个socket发送消息

3

发送聊天消息时,键入“回车”,程序退出

 

Enter键默认为确定操作

使“发送消息”按钮为默认按钮,按回车键可以发送消息

4

服务器取消保存时,客户端没有收到发送被拒绝的消息,继续以准备传输的状态等待

 

缺乏一个对服务器没有接收文件的事件的响应

1、服务器拒绝接收时,同时向客户端发送一个拒绝接收的信息

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值