源代码已经上传了。

第3章      设计文档

3.1       任务概述

本项任务要开发一款P2P文件传输软件,该软件可以在局域网和互连上使用,具有文件传输,断点续传,多线程连接等功能。

3.1.1      开发背景

随着网络的普及,在网络中交换信息,特别是文件成为使用网络时经常性工作,现有的文件传输工具如QQ、MSN等,主要功能是作为即时通讯工具使用,而且在局域网中使用时仍需连接到互连网。本文开发的软件基于P2P结构实现文件传输,不依靠服务器维护用户资料,所以,只要两台机器可以连通,就可以进行文件传输。

3.1.2       定义

P2P:即peer-to-peer,可以理解为点对点,或对等传输的意思。

3.1.3       开发工具

开发采用JAVA语言,开发工具为jbuilder 2005

3.2       文件传输业务流程

3.2.1       通讯顺序关系

在文件传输时,传输过程可以简单的分为4步,如图 :

1、由文件发送者发起文件传输,他首先发送文件名,文件大小,验证消息等信息给文件接收者。

2、文件接收者收到文件信息和发送者信息,决定是否接收,如不接收,则发送拒绝接收消息给文件发送者,文件传输结束。如同意接收,发送同意接收消息和文件传输起始字节(用于断点续传)给发送者。

3、发送者开始发送文件数据包,直到最后一个文件数据包,发送者在最后一个文件数据包上加上标记。

4、接收者识别最后一个文件数据包,文件传输成功。

3.2.2文件发送端的详细业务流程

图中显示了发送文件时的详细业务流程。

1、首先,要选择要发送的文件,可以选择一个文件或同一个文件夹下的多个文件发送,当选择多个文件时,软件将为每个文件建立一个传输线程。选择文件后,发送者要填写目标IP和端口,由于是基于P2P的文件传输,不存在服务器维护好友列表,所以需要知道目标IP才能传输文件,用户也可以填写验证消息用于描述自己的身份和文件的介绍。

2、发送者收到确认包,判断是否接收文件,如果不接收,则传输结束,如果接收,则打开要发送的文件,设置起始传输字节。

3、发送者读取一个文件片段,加入是否是最后一个文件片段的标志,打包发给接收者。

4、发送完最后一个文件片段时,文件传输结束。

3.2.3       文件接收者详细业务流程

1、 从一打开软件开始,监听线程就会启动,这时用户就扮演者文件接收者的角色,当有文件发送者发来请求时,监听线程建立与发送者的连接,并创建传输线程,接收者得到发送者传来的文件信息和验证消息,用户还能得到发送者的IP地址,用户根据这些信息决定是否接收文件,并发送确认包给发送者,确认包里包含了是否接收的标志,和开始传输的起始字节。

2、 接收者开始接收数据包,解包,写入文件中,直到最后一个文件片段,关闭文件,文件传输结束。

3.3       软件的传输协议设计

为了更好的控制文件传输的流程,开发设计了文件传输协议,该协议属于应用层协议,为了不使传输过程过于复杂,协议尽量简单设计。主要的内容是传输包的格式。

3.3.1       传输包的格式

其中传输包的类型有3种:

PACKAGE_TYPE_FILENAME = 0x01

文件名包,该包用于文件发送者向接收者发送文件信息和验证消息

PACKAGE_TYPE_CONTEXT = 0x02

文件内容包,该包用于传输文件内容

PACKAGE_TYPE_CONFIRMRECEIVE = 0x03

文件传输确认包,该包用于文件接收者向发送者确认文件的接收

3.3.2       文件名包格式

3.3.3文件传输包格式

其中MORE_DATA用于确认是否是文件片段的最后一个包,以结束文件的传输。0表示没有数据,1表示还有数据。

3. 3.4      文件接受确认包格式

其中CONFIRM_FLAG表示是否确认文件接收,1表示接收,0表示不接收,当接收时,OFF表示文件传输的起始字节,用来实现断点续传。

3.4      文件传输的状态机

文件传输线程的地层其实就是一个状态转换机,线程具有几个状态,线程从文件名传输状态开始,根据文件传输的不同情况,在各个状态间转换,直到传输成功或传输失败。

FILE_TRANS_STATUS_FILENAME = 0x01

文件名称传输状态,文件传输刚建立连接时,传输状态处于文件名传输状态

FILE_TRANS_STATUS_CONTEXT = 0x02

文件内容传输转台,在传输文件内容时,传输状态属于该状态

FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03

等待确认状态,文件发送者,发送完文件信息和验证消息后,处于该状态,文件接收者接收到文件信息和验证消息后处于该状态

FILE_TRANS_STATUS_SUCCESS = 0x04

文件传输成功状态,表示文件已成功传输完毕

FILE_TRANS_STATUS_FAIL = 0x05

文件传输失败状态,表示文件传输已经失败,失败原因可能是对方取消了文件传输或网络错误

3.5结构设计

软件主要由MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五个类构成图 表示了这几个类之间的关系。

类功能介绍

MainFrame

MainFrame类是软件的主界面类,负责与用户的交互。

TransFileManager

TransFileManager类是文件传输的控制类,负责管理文件的传输,它维护一个传输线程(SocketThread)的列表,每个线程都表示一个正在传输的任务。TransFileManager类定时的扫描各个线程的状态,根据不同状态做出不同处理,如计算传输速度,显示传输进度等。

SocketThread

SocketThread类是文件传输线程类,它负责底层的具体传输工作,包括打包与解包,并且转换自己的状态,完成文件的传输。

Server

Server类是为TransFileManager类使用的,它负责本地端口的监听,一旦有用户连接,TransFileManager就创建一个传输线程,放入线程列表。而它继续监听端口。

TransFilePanel

TransFilePanel是一个面板,它用有按钮、进度条,标签等用来显示文件的传输状态。

3.6        类设计

3.6.1       MainFrame

该类是视图类,是软件的主界面。

成员变量:

contentPane

contentPane是JPanel类的对象,是主界面的面板。

jbtnSend

jbtnSend是JButton类对象,点击它将打开文件传输对话框。

jbtnSetting

jbtnSetting是JButton类对象,点击它将打开设置对话框。

jlblIP

jlblIP是JLable类对象,它显示本机的IP地址,方便文件的传输。

jtpTransFile

jtpTransFile是JTabbedPane类对象,是选项卡控件,用于显示多个文件同时传输。

tfm

tfm是TransFileManager类对象,负责控制文件的传输。

成员方法:

jbtnSend_anctionPerformed()

该方法为jbtnSend按钮的点击事件

jbtnSetting_actionPerformed()

该方法为jbtnSetting按钮的点击事件

This_windowClosed()

该方法为窗口关闭事件

界面截图:

3.6.2       TransFileManager类

该类负责传输过程中对各个传输线程的检测与控制。

成员变量:

jtp

jtp是选项卡控件对象,是MainFrame类中jtpTransFile对象的一个引用。

panelist

paneList是ArrayList类对象,它是一个链表结构,存储使用的选项卡。

running

running是一个boolean型的对象,用来表示线程是否在执行。

s

s是Server类的对象,用来坚听本地端口,等待用户的连接。

threadList

threadList是ArrayList类对象,它是一个链表结构,存储使用的传输线程。

maxThreadNum

maxTreadNum是整型变量,表示最大允许的线程数。

port

port是整型变量,表示使用的端口号。

成员方法:

close()

该方法用于关闭文件传输的控制。

sendFile()

该方法用于建立一个文件发送,要求输入参数为,目标IP,端口号,要发送的文件和验证消息。

3.6.3SocketThread类

SocketThread类是文件传输的底层支持类,它提供文件传输的服务。

成员变量:

sendBuf

sendBuf是一个字节型数据,它是文件发送和接收时的缓冲区。

dis

dis是DataInputStream型对象,它是由Socket对象得到的输入流。

dos

dos是DataOutputStream型对象,它是由Socket对象得到的输出流。

fDis

fDis是DataInputStream型对象,它是要发送的文件的输入流。

raf

raf是RandomAccessFile型对象,该对象允许设置输出流的位置,以支持断点续传。

running

running是一个boolean型对象,用来表示线程是否在执行。

serverName

serverName是字符串型对象,表示服务器的地址,该对象只有在线程作为发送者时使用。

errorMessage

errorMessage是字符串型对象,表示出错的信息。

fileName

fileName是字符串型对象,表示文件名。

fileSender

fileSender是一个boolean型对象,表示是文件发送者还是文件接收者。

IP

IP是字符串型对象,用来存放目的机的IP地址。

message

message是字符串型对象,用来表示验证信息。

port

port是整型变量,表示连接的端口号。

transFileLength

transFileLength是长整型变量,表示已经传输的文件长度,TransFileManager可以用它来计算传输进度和传输速度

成员方法:

cancelTrans()

该方法用于取消传输

confirmReceiveFile()

该方法用于确认传输文件

参数flag用来表示是否同意传输

参数fileName用来表示保存的文件

参数off用来表示起始传输字节

getFileTransMessage()

该方法用于得到文件传输的基本信息。如:文件发送的目标,端口号等。

getStatus()

该方法返回一个整型变量,表示当前线程的传输状态。

run()

线程的执行方法,该方法中循环执行发送或接收方法,完成文件的发送或接收。

setError()

该方法通过一个字符串型的参数设置错误信息。

stopThread()

该方法用于停止线程的执行。

doPackage()

打包方法,该方法中,根据线程所处的不同状态,对数据加入不同的包头和其他信息,进行打包。

readFromFile()

该方法从要发送的文件中读取一个整型数。

readFromSocket()

该方法从Socket输入流读取一个整型数,它有一个重载版本读取一个字节数组的数据。

receiveFile()

该方法为接收文件的方法,是线程循环中,文件接收者执行的方法。

sendFile()

该方法为发送文件方法,是线程循环中,文件发送者执行的方法。

writeToFile()

该方法写一个字节数据的数据到保存的文件中。

writeToSocket()

该方法写数据到Socket输出流中,它有三个重载版本,分别是写入整型数,写入长整型数和写入字节数组数据。

3.6.3TransFilePanel类

这个类属于视图类,它作为主界面上的一个对象使用,含有进度条,按钮,标签的对象,用于显示文件传输状态,每一个传输线程都拥有自己的TransFilePanel类对象。

成员变量:

fileName

fileName是一个字符串,表示传输文件的文件名。

fileSender

fileSender是boolean型对象,表示是文件发送者还是接收者。

isCanneled

isCanneled是boolean型对象,传输过程中,用户点了取消按钮后,该标志位置true,TransFileManager会循环检测isCanneled标志,当发现其为true后,它会关闭对应的传输线程,而对方会检测到传输错误,文件传输就停止了。

isClosed

isClosed是boolean型对象,它表示当传输过程已经停止时,用户点击了关闭按钮,TransFileManager检测到isClosed为true时,会在列表中去掉对应的传输线程和TransFilePanel。

isConfirm

isConfirm是boolean型对象,它表示文件接收者是否确认了文件接收后(包括同意和拒绝),TransFileManager检测到isConfirm为true时,会将确认状态发给文件发送者。

jbtnCannel

jbtnCannel是取消按钮。

jbtnOK

jbtnOK是确定按钮。

jpgbFileTrans

jpgbFileTrans是文件传输的进度条。

jtaFileTransStatus

jtaFileTransStatus是一个文本框,用来显示文件传输的状态。

transFileLength

transFileLength是一个长整型变量,用来表示已经传输的文件长度。

status

status是一个整行变量,表示文件传输的状态,所表示的状态与SocketThread中的对应。

界面截图

3.7算法介绍

3.7.1 TransFileManager的循环监听

TransFileManger类继承了Thread类,实现多线程,避免循环监听时产生阻塞。

以下是在每次循环中做的工作

1、 得到传输线程(SocketThread)的数量和传输状态显示面板(TransFilePanel)的数量。

2、 从传输线程列表中依次取出一个传输线程。

3、 判断当前取出的线程是否有对应的传输状态显示面板,如果有执行5,如果没有执行4。

4、 增加传输状态显示面板,并且在主界面上增加选项卡。

5、 判断传输线程的状态,根据不同的状态做不同的处理。

6、 如果列表中的线程取完,执行1,没有取完执行2。

程序流程图:

3.7.2 断点续传

软件支持断点续传的功能,该功能主要算法如下:

1、 当文件传输中途停止时,文件接收者程序为接收的文件创建一个以该文件名+.tmp为文件名的临时文件,临时文件与该文件保存在同一个路径下。临时文件中保存文件以传输的字节数和文件的大小。

2、 当文件接收者接收该文件时,如果有对应的临时文件,程序会检测到该文件的临时文件,读取以传输的字节数和文件大小,并且比较传输的字节数与未完成传输的文件大小是否相等,文件大小和发送来的文件大小是否相等,如果都相等,执行3,否则执行4。

3、 将文件的输出流设置到应该继续传输的位置,并将起始传输字节数发给发送者,执行5。

4、 如果有未完成的传输文件,将其删除,执行5。

5、 进行文件传输。

程序流程图:

3.7.3本地端口的多连接监听

Server类对象负责本地端口的监听,可以支持多了连接,具体数量由用户设置。

1、用用户设置的端口创建监听,等待连接。

2、当有用户连接上后,用该连接创建一个SocketThread传输线程,加入到线程列表。

3、如果停止监听则退出,否则执行1。

程序流程图:

posted on 2007-11-03 11:19 Rex Mao 阅读(13283) 评论(5)  编辑  收藏 所属分类: 技术

java编程文件传输_JAVA文件传输程序相关推荐

  1. java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...

    问题标题 java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题.编写一个应用程序计算圆的周长和面积,设圆的半 2019-5-23来自ip:15.196.194.53的 ...

  2. java编程实现删除一个文件夹_Java实现文件夹删除方式总结详解

    1 ,通用的文件夹或文件删除方法,直接调用此方法,即可实现删除文件夹或文件,包括文件夹下的所有文件 /** *  根据路径删除指定的目录,无论存在与否 *@param sPath  要删除的目录pat ...

  3. Java编程的逻辑 (56) - 文件概述

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  4. Java编程的逻辑 (59) - 文件和目录操作

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. java i o中文版_Java文件I/O的三种方法

    摘要:之前在面试中被问到过两次Java中文件读入输出怎么写,当时只记得一个大概,没有办法很清晰的说出一个条理,今天特地看出总结了一下这方面的内容,想要写出来给大家分享.首先文件读入输出流常用有三种:F ...

  6. java 改变文件权限_Java文件权限

    java 改变文件权限 Java File class contains methods to check file permissions for the application user. The ...

  7. java 文件监控_Java 文件监控,实时监控文件加载

    前段时间设计一个文件自动加载系统模块,功能就像是在Tomcat的webapps目录下发布war包那样,只要一有war包加载进来,tomcat立刻就会去解压这个war包,并把它挂载在tomcat上,供网 ...

  8. java fileutils 文件夹_java文件操作---FileUtils

    Java的文件操作太基础,缺乏很多实用工具,比如对目录的操作,支持就非常的差了.如果你经常用Java操作文件或文件夹,你会觉得反复编写这些代码是令人沮丧的问题,而且要大量用到递归. 下面是的一个解决方 ...

  9. java 分块上传_Java 文件分块上传客户端和服务器端源代码

    本博客介绍如何进行文件的分块上传.本文侧重介绍客户端,服务器端请参考博客<Java 文件分块上传服务器端源代码>.建议读者朋友在阅读本文代码前先了解一下 MIME 协议. 所谓分块上传并非 ...

最新文章

  1. java数字排序代码,进阶加薪全靠它!
  2. 可扩展的Web架构和分布式系统
  3. OC与Swift混编
  4. mysql 不执行索引_mysql使用不上索引的几种情况
  5. 面试美团,面试官突然问我 Java “锁” ,我哭了
  6. Redis 集群(学习笔记十)
  7. java入门简单小项目_JAVA入门_java项目接入Mysql8.0
  8. 炫酷而不复杂,RDP报表实用又方便
  9. Windows10设置动态桌面壁纸
  10. (1)统一流程管理平台--前言
  11. android 自定义locale,android – 以编程方式设置Locale
  12. 数据分析学习总结笔记01:情感分析
  13. 聚名师之力,扬信息之帆,逐教育现代化浪潮——韶关市教育信息化蓝凌名教师工作室挂牌仪式
  14. 微信跳一跳游戏外挂(mac电脑+android手机)
  15. 图文:Linux-DNS主备服务器搭建(高可用)
  16. matplotlib.pyplot 库(一)
  17. [附源码]计算机毕业设计JAVA高校资源共享平台
  18. 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。
  19. 启动hadoop报错:Unable to load native-hadoop library for your platform... using builtin-java classes wher
  20. Educoder--Java面向对象(第八章) - 文件类

热门文章

  1. 【python】什么是python?python有什么用?
  2. .net core/5/6/7中WPF如何优雅的开始开发
  3. ltrace, strace
  4. 举例说明层次分析的三大原则_《搞定》一个境界、两个维度、三大原则让你轻松搞定繁重的事务...
  5. 大数据周会-本周学习内容总结016
  6. android加载二维码带中间logo
  7. 基于javaweb的医院门诊收费管理系统(java+jsp+jdbc+mysql)
  8. Unix 文件系统的核心目录总结
  9. Linux 多线程编程(三)
  10. CSGO 播放DEMO 闪退跳出到桌面无法播放问题解决