课程设计评分表.doc

网络文件传输系统2

收藏

资源目录
跳过导航链接。
网络文件传输系统2.zip
课程设计评分表.doc---(点击预览)
课程设计任务书.doc---(点击预览)
1304032048-吕滨-文件传输系统报告.doc---(点击预览)
源码
ClientMainFrame.java
Constants.java
MultiTransFile.java
signalClient.java
Tools.java
TransferClient.java
TransferServer.java
压缩包内文档预览:
预览图
编号:34769842    类型:共享资源    大小:198.19KB    格式:ZIP    上传时间:2019-12-25 上传人:遗**** IP属地:湖北
25
积分
关 键 词:
网络 文件传输 系统
资源描述:
网络文件传输系统2,网络,文件传输,系统
内容简介:
合肥学院计算机科学与技术系课程设计报告20162017学年第一学期课程JAVA语言课程设计名称文件传输系统学生姓名吕滨学号1304032048专业班级13网络工程(2)班指导教师檀明、许强2016 年 9 月目录一、设计题目及具体要求31、课程设计目的32、课程设计名称及内容33、任务和要求3二、总体设计思路31、主要思路32、主要技术难点43、主要实现过程5 客户端:5 服务器:5三、详细设计及编码实现51、程序运行环境及类说明52、模块功能划分6 2.1、通信模块6 2.2、文件传输模块7 2.3、多线程实现83、用户界面设计8四、总结11五、参考资料12六、主要源代码12一、设计题目及具体要求1、课程设计目的通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程JAVA语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。 (2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。 (3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)熟练掌握JAVA语言的输入输出流,灵活运用各种类库(尤其是网络编程相关的类)。掌握实现网络文件传输的方法,并了解TCP连接是基于字节流的。2、课程设计名称及内容网络文件传输系统3、任务和要求1系统的主要功能包括:(1)实现单线程文件传输功能;(2)在以上基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程;(3)加入异常控制依据,增强程序的鲁棒性(Robust);(4)了解如何提高套接字传输的速率,以及如何加强传输的稳定性。2在时间允许的情况下,适当考虑界面的美观;二、总体设计思路1、主要思路本文件传输系统采用C/S架构,分别有Server端和Client端。Server与Client利用基于TCP的Socket进行通信传输。其中Server端负责监听端口并等待接收文件,Client端可选择采用单线程或者多线程传输,然后选择文件发送给Server端,发送成功显示结果,失败则显示错误信息。传输过程如下图2.1。图2.12、主要技术难点(1) 文件读取、传输与接收文件读取使用一个文件对象来创建一个输入流对象来读取文件。首先得使用File()方法来创建一个文件对象,然后调用FileInputStream流从文件读取数据,为提高文件读取数率,将读取的文件流写入缓冲区buff。服务器端调用FileOutputStream流再将流还原为文件。文件传输这里使用的是socket来完成进程间的通信,Server端使用ServerSocket并设置监听端口accept()等待用户连接该端口;Client端使用socket并调用connect()来连接Server。当进行顺利时双方即可建立通信,进行数据的交换。文件接收Server端从socket中获取输入流写入缓冲区中,再将其重组成原文件即完成文件的接收工作。(2) 多线程传输为了继续加快文件的传输,其中一个解决方法是为多文件开启多线程并行进行传输,重写run()方法,循环调用,创建不同线程进行传输。一般方法为使用Thread的start()方法来启动线程,这里使用的是Executor来启动线程,Executor框架具有更易管理,效率更好(用线程池实现,节约开销)等优点。3、主要实现过程客户端:1. 用服务器的IP地址和端口号实例化Socket对象。2. 调用connect方法,连接到服务器上。3. 将文件发送到服务器的IO流填充到IO对象里,比如BufferedInputStream()/FileInputStream()(知识点:输入输出流)。4. 利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流或者从服务器接收数据。5. 通讯完成后,关闭打开的IO对象和Socket。服务器:1. 在服务器,用一个端口来实例化一个ServerSocket对象。此时,服务器就可以这个端口时刻监听从客户端发来的连接请求。2. 调用ServerSocket的accept方法,开始监听连接从端口上发来的连接请求,在调用accept方法时程序处于受阻状态,即不会执行后续代码,除了已经运行过的线程。3. 利用accept方法返回的客户端的Socket对象,进行读写IO的操作.通讯完成后,关闭打开的流和Socket对象。4.服务器调用accept函数然后开始等待新的请求。三、详细设计及编码实现1、程序运行环境及类说明1.1本程序在jdk version1.8编译成功运行(如下图3.1)。图3.11.2类的说明ClientMainFrame中包含客户端UI设计的方法,且为客户端程序的执行入口。ServerMainFrame中包含服务器端UI设计的各种方法,且未服务器端程序的执行入口。Tools中包含一些通用程序运行时需要的各类方法.如获取端口号getport(),获取IP的getip()方法等。signalClient中包含单线程文件传输的方法。TransferClient中包含多线程文件传输的方法。2、模块功能划分2.1、通信模块2.1.1服务器端的开发服务器端的工作是建立一个通信终端,被动的等待客户端的连接请求。 主要执行以下两步工作: 1)创建一个ServerSocket实例并指定本地端口(port)。这个套接字的功能是侦听该指定端口收到的连接。 ServerSocket serverSocket = new ServerSocket(int port); 2)重复执行: a)调用ServerSocket的accept()方法来获取下一个客户端连接。当有客户端有连接请求时,服务器对象serverSocket会响应这个连接,创建一个Socket实例,并由accept()方法返回。 Socket socket = serverSocket.accept(); b)使用返回的Socket实例的InputStream和OutputStream来跟客户端进行通信。 c)通信结束后,关闭I/O数据流,同时使用Socket类的close() 方法关闭该客户端套接字连接。同时注意异常处理代码的编写。 2.1.2客户端的开发客户端向服务器发起连接请求后,就被动的等待服务器的响应。 客户端要经过以下几步: 1)创建一个Socket实例。构造函数向指定的远程主机和端口建立一个TCP连接。 Socket socket=new Socket(String host,int port);其中,host为远程主机IP,port为其端口。 2)通过套接字的输入输出流(I/O Stream)进行通信,基于性能的考虑,TCP栈的实现一般使用带有缓冲的读写,我们采用BufferedInputStream和BufferedOutputStream来读写数据。 BufferedReader in=new BufferedReader(newInputStreamReader(s.getInputStream(); PrintWriter out = new PrintWriter(s.getOutputStream(),true); 3)使用Socket的close()方法关闭连接。与服务器端类似,也要注意异常处理代码的编写。 2.2、文件传输模块用来实现TCP/IP通信的端口套接字类,所有希望通过socket来完成与远程主机进行TCP/IP连接和通信的程序,都必须创建一个socket类的对象。这个类对象的作用首先是根据远程主机的IP地址和端口号在本地主机创建一个与远程主机的联接;其次,在连接建立后,本地主机程序就可以使用这个类对象提供的输入/输出通道与远程主机实现通信。当一个socket被创建时,它所指定的连接也将同时被建立并打开,若连接成功,调用这个socket对象的有关方法就可以实现与远程主机的读写通信操作;若连接失败,则构造函数会抛出例外,表示没有成功创建对象。Socket 对象的方法getInputStream()和getOutputStream()用来实现程序通过Socket 对远程方的读写。调用getInputStream()方法返回一个抽象的getInputStream对象,可以从远程方读取二进制数据;调用getOutputStream()方法可以返回一个抽象的getOutputStream对象,实现远程方的写入操作。由于getInputStream和getOutputStream都只是对二进制的原始数据的读写,而不能实现对复杂数据结构的直接操作,所以在实际应用中一般要先对getInputStream()和getOutputStream()方法返回的输入/输出流作加工变换后再使用。当与Socket的通信结束时,可用调用close()方法来关闭连接。另外,调用getLocalPort()和getInetAddress() 方法还可获得Socket连接的服务器的有关服务器端口号和IP地址等有关信息。ServerSocket 类它是java 用来实现TCP/IP通信服务器端程序的主要机制。当一个ServerSocket对象被创建时,程序在本机的指定端口处提供服务并开始监听可能的来自客户端的服务请求。当一个客户请求连接并被接受时,服务器程序将创建一个Socket对象与远程的客户机相连,实现读写通信操作。该类的accept()方法用来等待并接受客户机的一个连接,当这个方法被调用时,服务器进程或线程将处于阻塞状态,直至它监听到有一个客户进程提出服务请求,并与之成功连接,这时方法将返回一个新创建的服务器端的Socket对象,这个对象已经与远程客户机连接成功,并可以与客户机的Socket实现读写操作。若服务器可同时提供的连接数超过一个,则服务器程序应该创建一个新的线程来完成与客户机的通信,而保留原有监听线程继续准备接受其它客户机的服务请求。当ServerSocket对象要结束它在特定端口上提供的服务时,可以调用close()方法实现。2.3、多线程实现对于小规模系统,一般是一客户一线程,使用基本的java套接字就可以很好的运行,但是涉及同时处理上千个客户端服务器的时候,就会产生一些问题。一客户一线程服务器中,每个新线程都会消耗系统资源:创建一个线程将占用CPU周期,而且每个线程都有自己的数据结构(比如栈等)也都要消耗资源,另外,当一个线程阻塞时,JVM将保存其状态,选择另外一个线程运行,并在上下文转换时恢复阻塞线程的状态2。随着线程数的增加,线程将消耗越来越多的系统资源,这将最终导致系统花费更多的时间来处理上下文转换和线程管理,更少的时间来对连接进行服务。 为了避免这个问题,我们可以通过限制线程总数并重复使用线程来实现。具体做法就是:服务器启动时创建一个由固定数量线程组成的线程池。当一个新的客户端请求连接时,请求将交给线程池中的一个线程来处理,当该线程处理完这个客户的请求后,返回线程池中,准备处理下一次客户连接请求。如果客户连接请求到达服务器时,线程池中所有线程都已经被占用,它们则在一个队列中等待,直到有空闲的线程可用。 由于线程池中所有线程都反复循环,一个接一个的处理客户端连接,线程池服务器更像一组迭代服务器,与一客户一线程服务器不同的是,线程池中的线程在完成对一个客户端的服务后并不终止,而是重新开始在accept()方法上阻塞等待。 3、用户界面设计3.1服务器端启动,显示开启端口及线程数(如下图3.1)图3.13.2客户端程序启动,选择传输方式及服务器IP地址,再选择发送文件(如下图3.2)图3.23.3单线程发送文件(如下图3.3.1)图3.3.1服务器端显示传输日志(如下图3.3.2):图3.3.2验证是否传输成功(如下图3.3.3)图多线程发送文件(如下图3.4.1)图3.4.1服务器端接收日志(如下图3.4.2):图3.4.2客户端回执信息(如下图3.4.3):图3.4.3验证文件是否确实发送成功(如下图3.4.4)图3.4.4四、总结 本文通过主要利用Java Socket来实现文件传输系统,实现一个简单的服务器,客户端文件发送工具。并对Java Socket的实现进行简单的分析和讲解,通过本文以达到对Socket的原理又一个较清晰的认识。通过本次课程设计,让我学到了很多东西,对java socket有了进一步的了解,同时也让我学会了开发系统的结构理念及一些基本步骤。不足之处就是有些东西我掌握的还不够牢固和不够深入,我以后还须加倍努力。由于时间的仓促,加之水平有限,本课程设计中的缺点和不足之处在所难免,敬请老师给予批评指正!五、参考资料1 吕凤羽、马皓JAVA程序设计清华大学出版社2 耿祥义 JAVA课程设计 清华大学出版3 黄小东 Java课程设计案例精编中国水利水电出版社4 印旻 Java与面向对象程序设计清华大学出版社5 陈厚桥 基于Java技术的网吧计费系统设计 商丘职业技术学院学报六、主要源代码1.TransferClient.javapackage TCP;import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import .Socket; import java.util.ArrayList; import java.util.Random; import java.util.Vector; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;import javax.swing.JOptionPane; public class TransferClient private static ArrayList fileList = new ArrayList(); private String sendFilePath = Constants.SEND_FILE_PATH; public TransferClient(String filePath) getFilePath(filePath); public TransferClient() getFilePath(sendFilePath); public void service() ExecutorService executorService = Executors.newCachedThreadPool(); Vector vector = getRandom(fileList.size(); for(Integer integer : vector) String filePath = fileList.get(Value(); executorService.execute(sendFile(filePath); private void getFilePath(String dirPath) File dir = new File(dirPath); File files = dir.listFiles(); if(files = null) return; for(int i = 0; i files.length; i+) if(filesi.isDirectory() getFilePath(filesi.getAbsolutePath(); else fileList.add(filesi.getAbsolutePath(); private Vector getRandom(int size) Vector v = new Vector(); Random r = new Random(); boolean b = true; while(b) int i = r.nextInt(size); if(!v.contains(i) v.add(i); if(v.size() = size) b = false; return v; private static Runnable sendFile(final String filePath) return new Runnable() private Socket socket = null; /private String ip =localhost; /设置IP地址 /private int port = 10000; public void run() System.out.println(开始发送文件: + filePath); File file = new File(filePath); if(createConnection() int bufferSize = 8192; /缓冲区最大数目 byte buf = new bytebufferSize; try DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath); DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); dos.writeUTF(file.getName(); dos.flush(); dos.writeLong(file.length(); dos.flush(); int read = 0; int passedlen = 0; long length = file.length(); /获得要发送文件的长度 while (read = fis.read(buf) != -1) passedlen += read; System.out.println(已经完成文件 + file.getName() + 百分比: + passedlen * 100L/ length + %); dos.write(buf, 0, read); dos.flush(); fis.close(); dos.close(); socket.close(); System.out.println(文件 + filePath + 传输完成!); JOptionPane.showMessageDialog(null, 已经完成文件 + file.getName() + 的传输! ); catch (Exception e) e.printStackTrace(); private boolean createConnection() /创建socket连接服务器方法 try socket = new Socket(Tools.getIp(), Tools.getPort(); System.out.println(连接服务器成功!); return true; catch (Exception e) System.out.println(连接服务器失败!); JOptionPane.showMessageDialog(null, 连接服务器失败,请确认服务器是否开启!); return false; ; / public static void main(String args) / new TransferClient().service(); / 16合肥学院计算机科学与技术系课程设计任务书20162017学年第一学期课程JAVA语言课程设计课程设计名称网络文件传输系统专业班级13网工 (2) 班指导教师檀明、许强2016年9月一、 课程设计目的通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程JAVA语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。 (2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。 (3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)熟练掌握JAVA语言的输入输出流,灵活运用各种类库(尤其是网络编程相关的类)。掌握实现网络文件传输的方法,并了解TCP连接是基于字节流的。二、 课程设计名称及内容网络文件传输系统三、 任务和要求1系统的主要功能包括:(1)实现单线程文件传输功能;(2)在以上基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程;(3)加入异常控制依据,增强程序的鲁棒性(Robust);(4)了解如何提高套接字传输的速率,以及如何加强传输的稳定性。2在时间允许的情况下,适当考虑界面的美观
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:网络文件传输系统2
链接地址:https://www.renrendoc.com/p-34769842.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!