网络文件传输系统课程设计报告.doc

网络文件传输系统

收藏

资源目录
跳过导航链接。
网络文件传输系统.zip
13级网络工程2班-1304032018-张奔-网络文件传输系统
评分表.doc---(点击预览)
网络文件传输系统课程设计报告.doc---(点击预览)
任务书.doc---(点击预览)
wenjianchuanshu
Application1.java
Frame.java
MainFrame.java
MessageTypeInterface.java
Server.java
SettingDialog.java
SocketThread.java
Tool.java
TransFileDialog.java
TransFileManager.java
TransFilePanel.java
UDPListenerThread.java
压缩包内文档预览:(预览前20页/共51页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:34822154    类型:共享资源    大小:429.96KB    格式:ZIP    上传时间:2019-12-25 上传人:遗**** IP属地:湖北
25
积分
关 键 词:
网络 文件传输 系统
资源描述:
网络文件传输系统,网络,文件传输,系统
内容简介:
合肥学院计算机科学与技术系课程设计报告20162017学年第一学期课程 JAVA网络编程课程设计课程设计名称网络文件传输系统学生姓名 张奔学号1304032018专业班级13网络工程指导教师檀明、许强2016 年 9月网络文件传输系统课程设计报告1、 实验目的通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程JAVA语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。 (2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。 (3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)熟练掌握JAVA语言的输入输出流,灵活运用各种类库(尤其是网络编程相关的类)。掌握实现网络文件传输的方法,并了解TCP连接是基于字节流的。2、 实验要求1系统的主要功能包括:(1)实现单线程文件传输功能;(2)在以上基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程;(3)加入异常控制依据,增强程序的鲁棒性(Robust);(4)了解如何提高套接字传输的速率,以及如何加强传输的稳定性。2在时间允许的情况下,适当考虑界面的美观;三、设计概述本系统分为两个部分:第一部分是在线的用户列表。图1-用户在线列表该部分实现的功能有:持续的监听在线的用户,向使用者提供在线用户的计算机名和在线用户的IP地址。当有新的用户上线时和用户下线时及时的更新在线的PC列表。第二部分:图2-文件传输系统界面该部分实现的功能有:发送文件:图3-发送文件窗口发送文件的时候可以根据用户在线列表提供的IP来填写接收方的IP,设置接收方端口和选择需要发送的文件。还可以设置自身的端口号以及开启的最大线程数:图4-设置在文件传输时,传输过程可以简单的分为4步:1、由文件发送者发起文件传输,他首先发送文件名,文件大小,验证消息等信息给文件接收者。2、文件接收者收到文件信息和发送者信息,决定是否接收,如不接收,则发送拒绝接收消息给文件发送者,文件传输结束。如同意接收,发送同意接收消息和文件传输起始字节(用于断点续传)给发送者。3、发送者开始发送文件数据包,直到最后一个文件数据包,发送者在最后一个文件数据包上加上标记。4、接收者识别最后一个文件数据包,文件传输成功。发送文件时的详细业务流程:1、首先,要选择要发送的文件,可以选择一个文件或同一个文件夹下的多个文件发送,当选择多个文件时,软件将为每个文件建立一个传输线程。选择文件后,发送者要填写目标IP和端口,需要知道目标IP才能传输文件,用户也可以填写验证消息用于描述自己的身份和文件的介绍。2、发送者收到确认包,判断是否接收文件,如果不接收,则传输结束,如果接收,则打开要发送的文件,设置起始传输字节。3、发送者读取一个文件片段,加入是否是最后一个文件片段的标志,打包发给接收者。4、发送完最后一个文件片段时,文件传输结束。文件接收者详细业务流程1、从一打开软件开始,监听线程就会启动,这时用户就扮演者文件接收者的角色,当有文件发送 者发来请求时,监听线程建立与发送者的连接,并创建传输线程,接收者得到发送者传来的文件信息和验证消息,用户还能得到发送者的IP地址,用户根据这些信 息决定是否接收文件,并发送确认包给发送者,确认包里包含了是否接收的标志,和开始传输的起始字节。2、接收者开始接收数据包,解包,写入文件中,直到最后一个文件片段,关闭文件,文件传输结束。断点传输的详细流程:1、当文件传输中途停止时,文件接收者程序为接收的文件创建一个以该文件名+.tmp为文件名的临时文件,临时文件与该文件保存在同一个路径下。临时文件中保存文件以传输的字节数和文件的大小。2、当文件接收者接收该文件时,如果有对应的临时文件,程序会检测到该文件的临时文件,读取以传输的字节数和文件大小,并且比较传输的字节数与未完成传输的文件大小是否相等,文件大小和发送来的文件大小是否相等,如果都相等,执行3,否则执行4。3、将文件的输出流设置到应该继续传输的位置,并将起始传输字节数发给发送者,执行5。4、如果有未完成的传输文件,将其删除,执行5。5、进行文件传输。4、 实验结果及分析1、 开启程序:会出现在线PC列表和发送文件的窗口:图5-界面展示2、 通过用户在线列表填写发送文件的窗口:图6-发送文件窗口3、 开始发送文件图7-文件发送状态4、 开始接受文件图8-接收文件5、发送端文件传输状态图9-发送端文件传输状态6、 接收端文件传输状态:图10-接收端文件传输状态7、 断点传输流程图注意点:文件保存路径和文件名一致。5、 心得体会在科学技术飞速发展的今天,Internet已经和人们的日常生活息息相关无论是工作、学习还是娱乐,都离不开网络。比如有时候需要进行文件的传输虽然现在的许多网络文件,传输工具能基本满足人们对文件传输质量的要求,但是它们往往都存在安全性,工作效率低等问题。 本文件传输系统成功的实现了文件传输,并且具有断点传输功能,不论是较小范围内的局域网,还是远程网,而且还可以传输多种格式的文件,如word、视频、图像等。相比其它文件传输工具而言:本系统的优点。首先,界面简单、易于操作。其次,该系统支持断点传输,方便用户。这次的课程设计让我收获了许多,比如,对于面向对象编程又加深了进一步的理解附录:网络传输系统源代码package wenjianchuanshu;import java.awt.Toolkit;import javax.swing.SwingUtilities;import javax.swing.UIManager;import java.awt.Dimension;public class Application1 boolean packFrame = false; /* * Construct and show the application. */ public Application1() MainFrame frame = new MainFrame(); / Validate frames that have preset sizes / Pack frames that have useful preferred size info, e.g. from their layout if (packFrame) frame.pack(); else frame.validate(); / Center the window Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height screenSize.height) frameSize.height = screenSize.height; if (frameSize.width screenSize.width) frameSize.width = screenSize.width; frame.setLocation(screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); /* * Application entry point. * * param args String */ public static void main(String args) SwingUtilities.invokeLater(new Runnable() public void run() try UIManager.setLookAndFeel(UIManager. getSystemLookAndFeelClassName(); Frame.updateIP(); catch (Exception exception) exception.printStackTrace(); new Application1(); ); package wenjianchuanshu;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import java.io.File;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import .UnknownHostException;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.SwingUtilities;import javax.swing.SwingWorker;import javax.swing.table.DefaultTableModel;public class Frame extends JFrame private JTable usersTable=null;private JScrollPane jScrollPane=null;private JButton sendButton=null;private JButton refreshButton=null;private DefaultTableModel usersModel=null;UDPListenerThread udpListenerThread=null;/* * param string */private Frame(String title) super(title);/ TODO Auto-generated constructor stubString data=new String1002;String header=new String计算机名,IP地址;usersModel=new DefaultTableModel(data,header);usersTable=new JTable(usersModel) public boolean isCellEditable(int row, int column) return false; ; refreshButton=new JButton(刷新列表);sendButton=new JButton();jScrollPane=new JScrollPane(usersTable);this.add(jScrollPane);this.add(refreshButton);this.add(sendButton);udpListenerThread=new UDPListenerThread(usersModel);udpListenerThread.start();this.addWindowListener(new WindowListener() Overridepublic void windowOpened(WindowEvent e) / TODO Auto-generated method stubOverridepublic void windowIconified(WindowEvent e) / TODO Auto-generated method stubOverridepublic void windowDeiconified(WindowEvent e) / TODO Auto-generated method stubOverridepublic void windowDeactivated(WindowEvent e) / TODO Auto-generated method stubOverridepublic void windowClosing(WindowEvent e) / TODO Auto-generated method stubTool.sendXiaXianMessage();Overridepublic void windowClosed(WindowEvent e) / TODO Auto-generated method stubOverridepublic void windowActivated(WindowEvent e) / TODO Auto-generated method stub);/* * param args */public static void updateIP() / TODO Auto-generated method stubtry DatagramSocket testSocket = new DatagramSocket(5555);testSocket.close(); catch (SocketException e) / TODO Auto-generated catch blockSystem.exit(0);Frame mainFrame=new Frame(在线PC列表);mainFrame.setSize(350,250);Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = mainFrame.getSize();mainFrame.setLocation(screenSize.width - frameSize.width)/2-400, (screenSize.height- frameSize.height)/2-50);/mainFrame.setSize(350,250);mainFrame.setVisible(true);mainFrame.setResizable(false);mainFrame.setLayout(null);mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mainFrame.jScrollPane.setBounds(0,0,342,188);mainFrame.refreshButton.setBounds(0, 188, 100, 30);mainFrame.sendButton.setBounds(0, 0, 0, 0);Tool.sendShangXianMessage();package wenjianchuanshu;import java.awt.BorderLayout;import java.awt.Dimension;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JToolBar;import java.awt.*;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.*;import java.util.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import .InetAddress;import java.awt.event.WindowEvent;import java.awt.event.WindowAdapter;import java.io.*;public class MainFrame extends JFrame JPanel contentPane;/容器 JButton jbtnSend = new JButton(); JLabel jlblIP = new JLabel(); JButton jbtnSetting = new JButton(); JTabbedPane jtpTransFile = new JTabbedPane(); TransFileManager tfm=new TransFileManager(jtpTransFile); public MainFrame() try setDefaultCloseOperation(EXIT_ON_CLOSE); jbInit(); catch (Exception exception) exception.printStackTrace(); private void jbInit() throws Exception contentPane = (JPanel) getContentPane(); contentPane.setLayout(null); this.getContentPane().setBackground(new Color(206, 227, 249); setSize(new Dimension(400, 350); setTitle(网络文件传输系统); this.addWindowListener(new MainFrame_this_windowAdapter(this); jbtnSend.setBackground(new Color(236, 247, 255); jbtnSend.setBounds(new Rectangle(14, 14, 85, 25); jbtnSend.setFont(new java.awt.Font(宋体, Font.PLAIN, 13); jbtnSend.setBorder(BorderFactory.createRaisedBevelBorder(); jbtnSend.setText(发送文件); jbtnSend.addActionListener(new MainFrame_jbtnSend_actionAdapter(this); jlblIP.setText(本机IP:); jbtnSetting.setBackground(new Color(236, 247, 255); jbtnSetting.setBounds(new Rectangle(106, 14, 73, 25); jbtnSetting.setFont(new java.awt.Font(宋体, Font.PLAIN, 13); jbtnSetting.setBorder(BorderFactory.createRaisedBevelBorder(); jbtnSetting.setText(设置); jbtnSetting.addActionListener(new MainFrame_jbtnSetting_actionAdapter(this); jtpTransFile.setBackground(new Color(206, 227, 249); jtpTransFile.setBounds(new Rectangle( 0, 54, 402, 246); jlblIP.setFont(new java.awt.Font(宋体, Font.PLAIN, 13); jlblIP.setBounds(new Rectangle(197, 18, 180, 16); contentPane.setBackground(new Color(206, 227, 249); contentPane.setToolTipText(); contentPane.add(jtpTransFile); contentPane.add(jbtnSend); contentPane.add(jbtnSetting); contentPane.add(jlblIP); tfm.start(); byte ip=InetAddress.getLocalHost().getAddress(); jlblIP.setText(本机IP:+(ip0&0xff)+.+(ip1&0xff)+.+(ip2&0xff)+.+(ip3&0xff); public void jbtnSetting_actionPerformed(ActionEvent e) SettingDialog sd=new SettingDialog(this); sd.jtfPort.setText(String.valueOf(tfm.port); sd.jspnThreadNum.setValue(new Integer(tfm.maxThreadNum); sd.show(); if(sd.flag) if(tfm.port!=sd.port) tfm.setPort(sd.port); tfm.setMaxThreadNum(sd.threadNum); public void jbtnSend_actionPerformed(ActionEvent e) TransFileDialog tfd=new TransFileDialog(this); tfd.show(); if(tfd.flag) for(int i=0;i=maxThreadNum) socketThread.stopThread(); else socketPool.add(socketThread); catch (Exception ex) ex.printStackTrace(); try Thread.sleep(1000); catch (InterruptedException ex) ex.printStackTrace(); try checkServer.close(); catch (IOException ex1) public void stopThread() serverRunning=false; private void jbInit() throws Exception package wenjianchuanshu;import javax.swing.JDialog;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class SettingDialog extends JDialog boolean flag=false; int threadNum; int port; JLabel jlblThreadNum = new JLabel(); JSpinner jspnThreadNum = new JSpinner(new SpinnerNumberModel(5,1,10,1); JLabel jlblPort = new JLabel(); JTextField jtfPort = new JTextField(); JButton jbtnOK = new JButton(); JButton jbtnCancel = new JButton(); public SettingDialog() try jbInit(); catch (Exception ex) ex.printStackTrace(); public SettingDialog(JFrame owner) super(owner,true); try jbInit(); catch (Exception ex) ex.printStackTrace(); private void jbInit() throws Exception jlblThreadNum.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jlblThreadNum.setText(最大线程数); jlblThreadNum.setBounds(new Rectangle(30, 17, 75, 21); this.getContentPane().setLayout(null); jspnThreadNum.setBorder(BorderFactory.createEtchedBorder(); jspnThreadNum.setBounds(new Rectangle(123, 15, 63, 22); jbtnOK.addActionListener(new SettingDialog_jbtnOK_actionAdapter(this); jbtnCancel.addActionListener(new SettingDialog_jbtnCancel_actionAdapter(this); jlblPort.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jbtnOK.setBackground(new Color(236, 247, 255); jbtnOK.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jbtnOK.setBorder(BorderFactory.createRaisedBevelBorder(); jbtnCancel.setBackground(new Color(236, 247, 255); jbtnCancel.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jbtnCancel.setBorder(BorderFactory.createRaisedBevelBorder(); jtfPort.setBackground(Color.white); jtfPort.setBorder(BorderFactory.createEtchedBorder(); this.getContentPane().setBackground(new Color(206, 227, 249); this.setTitle(设置); this.getContentPane().add(jspnThreadNum, null); jbtnCancel.setBounds(new Rectangle(213, 85, 71, 25); jbtnCancel.setText(取消); jbtnOK.setBounds(new Rectangle(132, 85, 71, 25); jbtnOK.setText(确定); jtfPort.setText(); jtfPort.setBounds(new Rectangle(123, 52, 62, 21); jlblPort.setText(端口号); jlblPort.setBounds(new Rectangle(32, 50, 64, 16); this.getContentPane().add(jlblThreadNum, null); this.getContentPane().add(jtfPort); this.getContentPane().add(jlblPort); this.getContentPane().add(jbtnCancel); this.getContentPane().add(jbtnOK); this.setSize(300,160); this.setLocation(300,260); public void jbtnOK_actionPerformed(ActionEvent e) if(jtfPort.getText().trim().equals() JOptionPane.showMessageDialog(this,数据输入错误!); return; threadNum=(Integer)jspnThreadNum.getValue().intValue(); port=Integer.parseInt(jtfPort.getText(); flag=true; this.setVisible(false); public void jbtnCancel_actionPerformed(ActionEvent e) this.setVisible(false); class SettingDialog_jbtnCancel_actionAdapter implements ActionListener private SettingDialog adaptee; SettingDialog_jbtnCancel_actionAdapter(SettingDialog adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jbtnCancel_actionPerformed(e); class SettingDialog_jbtnOK_actionAdapter implements ActionListener private SettingDialog adaptee; SettingDialog_jbtnOK_actionAdapter(SettingDialog adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jbtnOK_actionPerformed(e); package wenjianchuanshu;import .Socket;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.*;import .*;/* * Socket线程 */public class SocketThread extends Thread public SocketThread() try jbInit(); catch (Exception ex) ex.printStackTrace(); public final static int CACHE_SIZE = 10240; /缓存大小 public final static int FILE_TRANS_STATUS_FILENAME = 0x01; /文件名传输状态 public final static int FILE_TRANS_STATUS_CONTEXT = 0x02; /文件内容传输状态 public final static int FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03; /等待确认接收文件 public final static int FILE_TRANS_STATUS_SUCCESS = 0x04; /文件传输成功 public final static int FILE_TRANS_STATUS_FAIL = 0x05; /文件传输失败 public final static int FILE_TRANS_STATUS_CANCELTRANS = 0x06; /取消文件传输 public final static int PACKAGE_TYPE_FILENAME = 0x01; /文件名包 public final static int PACKAGE_TYPE_CONTEXT = 0x02; /文件内容包 public final static int PACKAGE_TYPE_CONFIRMRECEIVE = 0x03; /是否接收文件 private Socket aSocket; /套接字 private String serverName; /服务器名称 private DataInputStream dis; /输入流 private DataOutputStream dos; /输出流 private DataInputStream fDis; /文件输入流 private RandomAccessFile raf; /文件输出流 private boolean fileSender = false; /文件发送者 private boolean running = false; /线程运行 public int fileTransStatus = 0x0; /文件传输状态 private File aFile; /传输的文件 public long fileSize; /文件大小 private String fileName; /文件名称 private String errorMessage; /错误消息 private long transFileLength = 0; /已传输字节数 private byte dataBuf; private String message; /验证消息 private String IP; /目标IP private int port; /目标端口 private boolean fileTransed=false; /文件是否已经开始传输 int count=0; /接收 public SocketThread(Socket aSocket) this.aSocket = aSocket; try aSocket.setSoTimeout(300000); catch (SocketException ex) byte address = aSocket.getInetAddress().getAddress(); IP = (address0 & 0xff) + . + (address1 & 0xff) + . + (address2 & 0xff) + . + (address3 & 0xff); try dis = new DataInputStream(aSocket.getInputStream(); dos = new DataOutputStream(aSocket.getOutputStream(); fileTransStatus = FILE_TRANS_STATUS_FILENAME; catch (IOException ex) setError(创建连接错误!); try aSocket.setReceiveBufferSize(CACHE_SIZE*2); catch (SocketException ex1) ex1.printStackTrace(); dataBuf=new byteCACHE_SIZE+100; /发送 public SocketThread(String serverName, int portNo, String fileName, String message) aFile = new File(fileName); this.fileName = aFile.getName(); this.fileSize = fileSize; fileSender = true; if (message != null) this.message = message; this.IP = serverName; this.port = portNo; dataBuf=new byteCACHE_SIZE; /线程执行函数 public void run() running = true; if (fileSender) try aSocket = new Socket(IP, port); aSocket.setSoTimeout(300000); aSocket.setSendBufferSize(CACHE_SIZE*2); dos = new DataOutputStream(aSocket.getOutputStream(); dis = new DataInputStream(aSocket.getInputStream(); fDis = new DataInputStream(new FileInputStream(aFile); fileTransStatus = FILE_TRANS_STATUS_FILENAME; catch (UnknownHostException ex1) ex1.printStackTrace(); setError(连接服务器错误!); catch (IOException ex1) ex1.printStackTrace(); setError(创建连接错误!); while (running) if (fileSender) sendFile(); else receiveFile(); try Thread.sleep(6); catch (InterruptedException ex) /从socket读 private int readFromSocket(byte data) throws IOException int length = 0; length = fDis.read(data); return length; /从socket读 private int readFromSocket() throws IOException int buf = 0; buf = dis.readInt(); return buf; /从文件读 private int readFromFile(byte data,int off,int length) int len=0; try len = fDis.read(data,off,length); catch (IOException ex) setError(文件读取错误!); return len; /写入socket private void writeToSocket(byte data) throws IOException dos.write(data); /写入文件 private void writeToFile(byte data,int off,int length) throws IOException raf.write(data,off,length); /写入socket private void writeToSocket(int data) throws IOException dos.writeInt(data); private void writeToSocket(long data) throws IOException dos.writeLong(data); private long readLongFromSocket() throws IOException return dis.readLong(); /打包 private byte doPackage(byte data, int length) throws IOException ByteArrayOutputStream buf = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream bufDos = new DataOutputStream(buf); DataOutputStream baosDos = new DataOutputStream(baos); switch (fileTransStatus) case FILE_TRANS_STATUS_FILENAME: bufDos.writeInt(PACKAGE_TYPE_FILENAME); bufDos.writeInt(fileName.getBytes().length); bufDos.write(fileName.getBytes(); bufDos.writeLong(fileSize); if (message!=null) bufDos.writeInt(message.getBytes().length); bufDos.write(message.getBytes(); else bufDos.writeInt(-1); baosDos.writeInt(buf.toByteArray().length); baosDos.write(buf.toByteArray(); break; case FILE_TRANS_STATUS_CONTEXT: bufDos.writeInt(PACKAGE_TYPE_CONTEXT); if (transFileLength + length) = fileSize) bufDos.writeInt(0); else bufDos.writeInt(1); bufDos.writeInt(length); bufDos.write(data, 0, length); baosDos.writeInt(buf.toByteArray().length); baosDos.write(buf.toByteArray(); break; return baos.toByteArray(); /停止线程 public void stopThread() running = false; try if (dis != null) dis.close(); if (dos != null) dos.close(); if (fDis != null) fDis.close(); if (raf != null) raf.close(); catch (Exception ex) /解包 private void upPackage(byte data) ByteArrayInputStream bias = new ByteArrayInputStream(data); DataInputStream biasDis = new DataInputStream(bias); int type = 0; try type = biasDis.readInt(); catch (SocketTimeoutException ex) setError(网络超时!); catch (IOException ex1) setError(对方取消了文件传输或网络错误!); switch (type) case PACKAGE_TYPE_FILENAME: try int length = biasDis.readInt(); bias.read(dataBuf,0,length); fileName = new String(dataBuf,0,length); fileSize = biasDis.readLong(); length = biasDis.readInt(); if (length !=-1) bias.read(dataBuf,0,length); message = new String(dataBuf,0,length); fileTransStatus = FILE_TRANS_STATUS_WAITFORCONFIRM; catch (SocketTimeoutException ex) setError(网络超时!); catch (IOException ex) setError(对方取消了文件传输或网络错误!); break ; case PACKAGE_TYPE_CONTEXT: try int flag = biasDis.readInt(); int length = biasDis.readInt(); bias.read(dataBuf,0,length); writeToFile(dataBuf,0,length); transFileLength += length; if (flag = 0) fileTransStatus = FILE_TRANS_STATUS_SUCCESS; stopThread(); catch (SocketTimeoutException ex) setError(网络超时!); catch (IOException ex) setError(对方取消了文件传输或网络错误!); break ; /发送文件 private void sendFile() int length; switch (fileTransStatus) case FILE_TRANS_STATUS_FILENAME: try byte buf; fileName = aFile.getName(); fileSize = aFile.length(); buf = doPackage(null, 0); writeToSocket(buf); fileTransStatus = FILE_TRANS_STATUS_WAITFORCONFIRM; catch (IOException ex) setError(对方取消了文件传输或网络错误!); break ; case FILE_TRANS_STATUS_WAITFORCONFIRM: int flag; try flag = readFromSocket(); if (flag = 0) setError(对方拒绝了文件传输!); else fileTransStatus = FILE_TRANS_STATUS_CONTEXT; transFileLength = readLongFromSocket(); fDis.skip(transFileLength); aSocket.setSoTimeout(30000); catch (SocketTimeoutException ex) setError(网络超时!); catch (IOException ex) setError(对方取消了文件传输或网络错误!); break ; case FILE_TRANS_STATUS_CONTEXT: length = readFromFile(dataBuf,0,CACHE_SIZE); try writeToSocket(doPackage(dataBuf, length); transFileLength += length; if (transFileLength = fileSize) fileTransStatus = FILE_TRANS_STATUS_SUCCESS; Thread.sleep(1000); stopThread(); catch (IOException ex) setError(对方取消了文件传输或网络错误!); catch (InterruptedException ex1) count+; if(count=2) /stopThread(); break ; /接收文件 private void receiveFile() if (fileTransStatus = FILE_TRANS_STATUS_CONTEXT | fileTransStatus = FILE_TRANS_STATUS_FILENAME) try int length = dis.readInt(); int len=dis.read(dataBuf,0,length); while(len0) writeToSocket(off); else writeToSocket(0L); File aFile=new File(fileName); if(aFile.exists() System.out.println(*); aFile.delete(); raf = new RandomAccessFile(fileName, rws); this.fileName = fileName; fileTransStatus = FILE_TRANS_STATUS_CONTEXT; fileTransed=true; raf.seek(off); catch (FileNotFoundException ex) setError(创建文件错误!); catch (IOException ex) setError(对方取消了文件传输或网络错误!); transFileLength = off; else try writeToSocket(0); writeToSocket(0L); catch (IOException ex) setError(对方取消了文件传输或网络错误!); /返回已传输字节数 public long getTransFileLength() return transFileLength; /设置错误消息 public void setError(String errorMessage) fileTransStatus = FILE_TRANS_STATUS_FAIL; this.errorMessage = errorMessage; if (!fileSender&fileTransed) File tmpFile = new File(fileName + .tmp); try DataOutputStream dos = new DataOutputStream(new FileOutputStream( tmpFile); dos.writeLong(transFileLength); dos.writeLong(fileSize); dos.close(); catch (IOException ex) stopThread(); /返回错误消息 public String getErrorMessage() return errorMessage; /返回传输状态 public int getStatus() return fileTransStatus; /是否是文件发送者 public boolean isFileSender() return fileSender; public void cancelTrans() if (fileTransStatus = FILE_TRANS_STATUS_WAITFORCONFIRM) confirmReceiveFile(false, null, 0); setError(已取消文件传输!); public String getMessage() return message; public String getIP() return IP; public int getPort() return port; public String getFileName() if (fileName.length() 10) return fileName.substring(0, 10) + . + fileName.substring(fileName.lastIndexOf(.), fileName.length(); else return fileName; public String getFileTransMessage() if(fileSender) return 文件发送 目标IP: +getIP()+ 端口:+getPort(); else return 文件接收 来自: +getIP(); private void jbInit() throws Exception package wenjianchuanshu;import java.io.File;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .ServerSocket;import .SocketException;import .UnknownHostException;import javax.swing.JOptionPane;public class Tool private static ServerSocket serverSocket=null;/得到本台主机名public static String getHostName()String hostName=null;try hostName=InetAddress.getLocalHost().getHostName(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace();return hostName;/把收到的字节数组 分割成 字符串数组public static String splitString(DatagramPacket recivePacket)int reciveLen=recivePacket.getLength();byte b=new bytereciveLen;for(int i=0;ireciveLen;i+)bi=recivePacket.getData()i;String reciveString=new String(b);String array=reciveString.split();return array;/把IP前面的/去掉public static String getIpString(DatagramPacket recivePacket)String ip=recivePacket.getAddress().toString();return ip.substring(1); /群播上线消息public static void sendShangXianMessage()try DatagramSocket sendSocket=new DatagramSocket();InetAddress sendAddress=InetAddress.getByName(MessageTypeInterface.QUN_BO_ZU);String sendString=MessageTypeInterface.SHANG_XIAN+Tool.getHostName();byte sendData=sendString.getBytes();DatagramPacket sendPacket=new DatagramPacket(sendData,sendData.length,sendAddress,MessageTypeInterface.UDP_SERVER_PORT);sendSocket.send(sendPacket);sendSocket.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (SocketException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/向某一主机发送在线消息public static void sendOnLineMessage(DatagramPacket recivePacket)try DatagramSocket sendSocket=new DatagramSocket();InetAddress sendAddress=recivePacket.getAddress();String sendString=MessageTypeInterface.ON_LINE+Tool.getHostName();byte sendData=sendString.getBytes();DatagramPacket sendPacket=new DatagramPacket(sendData,sendData.length,sendAddress,5555);sendSocket.send(sendPacket);sendSocket.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (SocketException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/群播下线消息public static void sendXiaXianMessage()try DatagramSocket sendSocket=new DatagramSocket();InetAddress sendAddress=InetAddress.getByName(55);String sendString=MessageTypeInterface.OUT_LINE;byte sendData=sendString.getBytes();DatagramPacket sendPacket=new DatagramPacket(sendData,sendData.length,sendAddress,5555);sendSocket.send(sendPacket);sendSocket.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (SocketException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/获得TCP 的serverSocketpublic static ServerSocket getServerSocket()if(serverSocket=null)try serverSocket=new ServerSocket(MessageTypeInterface.TCP_SERVER_PORT); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return serverSocket;/根据接收报获得主机名public static String getHostNameByPacket(DatagramPacket recivePacket)return recivePacket.getAddress().getHostName();public static String getFileNameByPath(String path)String fileName=path.substring(path.lastIndexOf()+1);return fileName;package wenjianchuanshu;import javax.swing.JDialog;import javax.swing.JLabel;import java.awt.*;import javax.swing.JTextField;import javax.swing.JButton;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import java.io.File;public class TransFileDialog extends JDialog File files; boolean flag=false; String serverName; int port; String message; Object items; public TransFileDialog(JFrame owner) super(owner,true); this.items=items; try jbInit(); catch (Exception ex) ex.printStackTrace(); private void jbInit() throws Exception jlblServerName.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jlblServerName.setText(对方IP); jlblServerName.setBounds(new Rectangle(32, 22, 73, 26); this.getContentPane().setLayout(null); jbtnCancel.setBackground(new Color(236, 247, 255); jbtnCancel.setBounds(new Rectangle(294, 213, 71, 25); jbtnCancel.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jbtnCancel.setBorder(BorderFactory.createRaisedBevelBorder(); jbtnCancel.setText(取消); jbtnCancel.addActionListener(new TransFileDialog_jbtnCancel_actionAdapter(this); jbtnOK.setBackground(new Color(236, 247, 255); jbtnOK.setBounds(new Rectangle(195, 214, 71, 25); jbtnOK.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jbtnOK.setBorder(BorderFactory.createRaisedBevelBorder(); jbtnOK.setText(确定); jbtnOK.addActionListener(new TransFileDialog_jbtnOK_actionAdapter(this); jbtnFile.setBackground(new Color(236, 247, 255); jbtnFile.setBounds(new Rectangle(297, 116, 71, 25); jbtnFile.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jbtnFile.setBorder(BorderFactory.createRaisedBevelBorder(); jbtnFile.setText(浏览); jbtnFile.addActionListener(new TransFileDialog_jbtnFile_actionAdapter(this); jtfFile.setBackground(Color.white); jtfFile.setBorder(BorderFactory.createEtchedBorder(); jtfFile.setText(); jtfFile.setBounds(new Rectangle(127, 118, 164, 21); jlblFile.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jlblFile.setText(文件); jlblFile.setBounds(new Rectangle(32, 120, 34, 16); jtfPort.setBackground(Color.white); jtfPort.setBorder(BorderFactory.createEtchedBorder(); jtfPort.setText(5000); jtfPort.setBounds(new Rectangle(129, 72, 62, 21); jlblPort.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jlblPort.setText(接收方端口号); jlblPort.setBounds(new Rectangle(32, 67, 67, 31); jtfServerName.setBackground(Color.white); jtfServerName.setBorder(BorderFactory.createEtchedBorder(); this.getContentPane().setBackground(new Color(206, 227, 249); this.setTitle(发送文件); jlblMessage.setFont(new java.awt.Font(宋体, Font.PLAIN, 12); jlblMessage.setText(验证信息); jlblMessage.setBounds(new Rectangle(32, 169, 75, 25); jtfMessage.setBackground(Color.white); jtfMessage.setBorder(BorderFactory.createEtchedBorder(); jtfMessage.setText(); jtfMessage.setBounds(new Rectangle(126, 169, 225, 29); this.getContentPane().add(jtfServerName); this.getContentPane().add(jtfPort); this.getContentPane().add(jlblFile); this.getContentPane().add(jlblServerName, null); this.getContentPane().add(jtfFile); this.getContentPane().add(jbtnFile); this.getContentPane().add(jlblPort); this.getContentPane().add(jbtnCancel); this.getContentPane().add(jbtnOK); this.getContentPane().add(jlblMessage); this.getContentPane().add(jtfMessage); jtfServerName.setText(); jtfServerName.setBounds(new Rectangle(127, 25, 220, 21); this.setSize(400,300); this.setLocation(300,300); JLabel jlblServerName = new JLabel(); JTextField jtfServerName = new JTextField(); JLabel jlblPort = new JLabel(); JTextField jtfPort = new JTextField(); JLabel jlblFile = new JLabel(); JTextField jtfFile = new JTextField(); JButton jbtnFile = new JButton(); JButton jbtnOK = new JButton(); JButton jbtnCancel = new JButton(); JLabel jlblMessage = new JLabel(); JTextField jtfMessage = new JTextField(); public void jbtnFile_actionPerformed(ActionEvent e) JFileChooser jfc=new JFileChooser(); jfc.setMultiSelectionEnabled(true); String fileName=; jfc.showOpenDialog(this); files=jfc.getSelectedFiles(); for(int i=0;ifiles.length;i+) fileName=fileName+filesi.getAbsolutePath()+; jtfFile.setText(fileName); public void jbtnOK_actionPerformed(ActionEvent e) if(jtfServerName.getText().trim().equals()|jtfPort.getText().trim().equals()|jtfFile.getText().trim().equals() JOptionPane.showMessageDialog(this,数据填写错误!); return; serverName=jtfServerName.getText(); port=Integer.parseInt(jtfPort.getText(); message=jtfMessage.getText(); flag=true; this.setVisible(false); public void jbtnCancel_actionPerformed(ActionEvent e) this.setVisible(false); class TransFileDialog_jbtnCancel_actionAdapter implements ActionListener private TransFileDialog adaptee; TransFileDialog_jbtnCancel_actionAdapter(TransFileDialog adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jbtnCancel_actionPerformed(e); class TransFileDialog_jbtnOK_actionAdapter implements ActionListener private TransFileDialog adaptee; TransFileDialog_jbtnOK_actionAdapter(TransFileDialog adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jbtnOK_actionPerformed(e); class TransFileDialog_jbtnFile_actionAdapter implements ActionListener private TransFileDialog adaptee; TransFileDialog_jbtnFile_actionAdapter(TransFileDialog adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jbtnFile_actionPerformed(e); package wenjianchuanshu;import javax.swing.*;import java.util.*;import java.io.*;public class TransFileManager extends Thread public TransFileManager() try jbInit(); catch (Exception ex) ex.printStackTrace(); private JTabbedPane jtp; private boolean running = false; private ArrayList paneList = new ArrayList(); private ArrayList threadList = new ArrayList(); private Server s; int maxThreadNum = 5; int port=5000; /构造函数 public TransFileManager(JTabbedPane jtp) this.jtp = jtp; s = new Server(threadList); SocketThread st; s.start(); public void run() running = true; SocketThread st; TransFilePanel tfp; int threadListSize; int paneListSize; while (running) threadListSize = threadList.size(); paneListSize = paneList.size(); for (int i = 0; i threadListSize; i+) st = (SocketThread) threadList.get(i); if (paneListSize = i) try Thread.sleep(100); catch (InterruptedException ex2) tfp = new TransFilePanel(st.isFileSender(); jtp.addTab(st.getFileName(), tfp); paneList.add(tfp); tfp.jtaFileTransStatus.setText(文件发送 目标IP:+st.getIP()+ 端口:+st.getPort()+nn正在与对方建立连接.); else tfp = (TransFilePanel) paneList.get(i); tfp.setStatus(st.getStatus(); if (tfp.isCanneled) st.cancelTrans(); switch (st.getStatus() case SocketThread.FILE_TRANS_STATUS_WAITFORCONFIRM: if (st.isFileSender() tfp.jtaFileTransStatus.setText(st.getFileTransMessage()+nn连接成功! 等待对方回应.); else tfp.jtaFileTransStatus.setText(st.getFileName() + ( + st.fileSize + B) 是否接收?n+来自:+st.getIP()+n简短附言:+st.getMessage(); if (tfp.isConfirm) if(tfp.fileName!=null) File aFile = new File(tfp.fileName); long off=0,size; if (aFile.exists() File temFile=new File(aFile.getAbsolutePath()+.tmp); if(temFile!=null) try DataInputStream dis=new DataInputStream(new FileInputStream(temFile); off = dis.readLong(); System.out.println(off); size=dis.readLong(); if(off!=new File(tfp.fileName).length()|size!=st.fileSize) off=0; catch (IOException ex1) off=0; st.confirmReceiveFile(true,tfp.fileName,off); else st.confirmReceiveFile(false,0); break; case SocketThread.FILE_TRANS_STATUS_CONTEXT: double progress = st.getTransFileLength() * 1.0 / st.fileSize * 100; double transSpeed = (st.getTransFileLength() - tfp.transFileLength) / 1024 * 2; tfp.transFileLength = st.getTransFileLength(); tfp.jpgbFileTrans.setValue(int) progress); tfp.jtaFileTransStatus.setText(st.getFileTransMessage()+nn); tfp.jtaFileTransStatus.setText(tfp.jtaFileTransStatus.getText()+传输速度: + (int) transSpeed + k/s+ 已完成: + (int) progress + %); break; case SocketThread.FILE_TRANS_STATUS_SUCCESS: tfp.jtaFileTransStatus.setText(st.getFileTransMessage()+nn传输成功!); if(!st.isFileSender() new File(tfp.fileName+.tmp).delete(); if (tfp.isClosed) threadList.remove(i); paneList.remove(i); jtp.remove(i); i-; threadListSize-; paneListSize-; break; case SocketThread.FILE_TRANS_STATUS_FAIL: tfp.jtaFileTransStatus.setText(st.getFileTransMessage()+nn传输失败! + st.getErrorMessage(); if (tfp.isClosed) threadList.remove(i); paneList.remove(i); jtp.remove(i); i-; threadListSize-; paneListSize-; break; try Thread.sleep(500); catch (InterruptedException ex) public void sendFile(String serverName, int port, String fileName,String message) if (threadList.size() maxThreadNum) SocketThread st = new SocketThread(serverName, port, fileName,message); st.start(); threadList.add(st); public void setPort(int port) s.stopThread(); s = new Server(threadList); s.port = port; this.port=port; s.start(); public void setMaxThreadNum(int num) this.maxThreadNum = num; s.maxThreadNum=num; public void close() s.stopThread(); SocketThread st; for(int i=0;ithreadList.size();i+) st=(SocketThread)threadList.get(i); st.stopThread(); private void jbInit() throws Exception package wenjianchuanshu;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JProgressBar;import java.awt.*;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;public class TransFilePanel extends JPanel int status; boolean fileSender = false; boolean isClosed = false; String fileName; boolean isConfirm = false; boolean isCanneled=false; long transFileLength=0; JProgressBar jpgbFileTrans = new JProgressBar(); JButton jbtnOK = new JButton(); JButton jbtnCannel = new JButton(); JTextArea jtaFileTransStatus = new JTextArea(); public TransFilePanel(boolean fileSender) this.fileSender = fileSender; try jbInit(); catch (Exception ex) ex.printStackTrace(); private void jbInit() throws Exception this.setLayout(null); jpgbFileTrans.setBounds(new Rectangle(19, 104, 209, 18); jbtnOK.setBackground(new Color(236, 247, 255); jbtnOK.setBounds(new Rectangle(233, 101, 67, 25); jbtnOK.setText(接收); jbtnOK.addActionListener(new TransFilePanel_jbtnOK_actionAdapter(this); jbtnCannel.setBackground(new Color(236, 247, 255); jbtnCannel.setBounds(new Rectangle(306, 101, 67, 25); jbtnCannel.setText(取消); jbtnCannel.addActionListener(new TransFilePanel_jbtnCannel_actionAdapter(this); this.setBackground(new Color(206, 227, 249); this.setBorder(BorderFactory.createEtchedBorder(); jtaFileTransStatus.setBackground(new Color(206, 227, 249); jtaFileTransStatus.setDisabledTextColor(Color.orange); jtaFileTransStatus.setText(); jtaFileTransStatus.setWrapStyleWord(tr
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:网络文件传输系统
链接地址:https://www.renrendoc.com/p-34822154.html

官方联系方式

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

网站客服QQ:2881952447     

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

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

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