JAVA Ftp编程--远程下载文件
来源:互联网 发布:php广告系统 编辑:程序博客网 时间:2024/05/16 19:07
实现一个客户端下载服务端提供的文件的程序
首先,服务端开启,7*24小时全天候360度无死角监控,针对每一个连接的Socket对象单独开启一个线程提供文件共享服务,线程中的run方法将目录中文件列表传输到客户端.然后,每当有客户端连接后,客户端就能够获取服务端传递过来的输入流并包装为对象输入流.接着,客户端向服务端传输文件编号,该过程中需要完成一个检测编号是否正确的方法.服务端的线程中有接收指令和传输文件的方法,服务端接收到客户端发送过来的指令后,便会传输文件.整个流程就是这样了.使用到的知识点包括IO流,Socket,Set,Map集合,线程等等.
![..](http://img.blog.csdn.net/20170803223201306?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGFuZ2xhbmd6b2RpYWM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
/*** 客户端*/import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.ObjectInputStream;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;import java.util.Set;import java.util.TreeMap;public class FtpClient { private Socket s; private File dir; public FtpClient(Socket s,File dir) { this.s = s; this.dir = dir; } public void init(){ try { /****显示可供下载的文件列表****/ //获取服务端传递过来的输入流并包装为对象输入流 ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); TreeMap<Integer,String> files = (TreeMap<Integer, String>) ois.readObject(); System.out.println("请输入需要下载的文件编号:"); Set<Integer> ids = files.keySet(); for (Integer id : ids) { String fname = files.get(id); System.out.println(id+"----"+fname); } /******向服务端传输文件编号*****/ sendCommand(files); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //发送指令 public void sendCommand(TreeMap<Integer,String> map) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String comm = br.readLine(); //检查输入内容是否是数字 if(comm.matches("^\\d*$")){ //将输入的编号转换为int类型 int inputNo = Integer.parseInt(comm); boolean isExist = false;//假设需要被下载的文件序号是不存在的 for (int i: map.keySet()) { if(inputNo == i){ isExist = true; break; } } if(isExist){ //真正发送指令 realSendComm(inputNo); //开始下载 String fname = map.get(inputNo);//根据编号获取文件名 //客户端存储的文件 File distFile = new File(dir,fname); //真正的下载文件 download(distFile); } else{ System.out.println("输入的文件编号有误!请重新输入"); sendCommand(map); } }else{ System.out.println("输入的文件编号有误!请重新输入"); sendCommand(map); } } //真正的下载文件 private void download(File distFile) throws IOException { System.out.println("开始下载..."); //将Socket中的数据取出,并复制到目标文件中 BufferedInputStream bis = new BufferedInputStream(s.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(distFile)); byte[] b = new byte[1024]; int len = 0; while((len = bis.read(b)) != -1){ bos.write(b, 0, len); } bos.close(); bis.close(); System.out.println("下载完成!"); } //开始下载 private void realSendComm(int inputNo) throws IOException { PrintStream ps = new PrintStream(s.getOutputStream()); //将文件编号转换为字符串发送到服务端 ps.println(String.valueOf(inputNo)); } public static void main(String[] args) throws UnknownHostException, IOException { File dist = new File("D:/");//客户端存储文件目录 Socket s = new Socket("192.168.46.26",10086); new FtpClient(s,dist).init(); }}/*** 服务端*/import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.TreeMap;public class FtpServer extends Thread{ private File dir;//需要被共享的目录 private Socket s;//当前连接的客户端 public FtpServer(File dir, Socket s) { super(); this.dir = dir; this.s = s; } @Override public void run() { //1.将目录中文件列表传输到客户端 sendList(); } public void sendList(){ //列出目录中所有的文件名称 String[] filesName = dir.list(); //TreeMap有序,将文件名以键值对形式存储到map集合中 TreeMap<Integer,String> files = new TreeMap<>(); for (int i = 0; i < filesName.length; i++) { files.put(i+1, filesName[i]); } try { //获取基于Socket的对象输出流(通过Socket向客户端发送文件列表) ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); oos.writeObject(files); oos.flush(); //接收指令 receiveCommand(files); } catch (IOException e) { e.printStackTrace(); } } //接收指令 public void receiveCommand(TreeMap<Integer,String> files) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String s = br.readLine(); int fno = Integer.parseInt(s); String fname = files.get(fno); //根据共享目录以及客户端需要下载文件名,创建File对象 File source = new File(dir,fname); //发送文件 trasFile(source); } //传输文件 private void trasFile(File source) throws IOException { System.out.println("开始传输..."); //获取文件的输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source)); //获取Socket的输出流 BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream()); byte[] b = new byte[1024]; int len = 0; while((len = bis.read(b)) != -1){ bos.write(b, 0, len); } bos.close();//流要关闭 bis.close(); System.out.println("传输完成!"); } public static void main(String[] args) { try { //声明被共享的目录对象 File dir = new File("D:\\larva搞笑虫子"); System.out.println("服务器已启动..."); ServerSocket ss = new ServerSocket(10086); Socket s = null; while(true){ //7*24监听客户端连接 s = ss.accept(); System.out.println("客户端已连接."+s.getInetAddress().getHostAddress()); //针对每一个连接的Socket对象单独开启一个线程提供文件共享服务 new FtpServer(dir,s).start(); } } catch (IOException e) { e.printStackTrace(); } }}
阅读全文
0 0
- JAVA Ftp编程--远程下载文件
- java下载远程FTP文件至本地
- 远程下载文件 FTP
- java 远程从FTP服务器下载文件到本地
- JAVA FTP 下载文件
- java ftp 文件下载
- ftp远程下载文件一、远程文件下载
- 【Nginx 3】FTP远程文件下载
- java 下载远程文件
- JAVA下载远程文件
- java 远程文件 下载
- java实现ftp下载文件
- java读取ftp文件下载
- java中FTP下载文件
- java关于ftp文件下载
- java中FTP下载文件
- 远程传输文件编程之FTP
- Api 编程 远程文件下载
- jdk 源码分析(11)java ArrayBlockingQueue 缓存队列分析
- 基于libpcan库can总线操作的Barrett 机械手控制及腕部六维力传感器驱动
- 基于Grub 2.00的x86内核引导流程--源代码情景分析(2)
- QML 设计自定义样式CheckBox,可改变字体大小
- 机器学习有感
- JAVA Ftp编程--远程下载文件
- 【剑指offer】面试题58(2):左旋转字符串
- 素数筛选法打表模板
- 【面试】2017.8.3菜鸟内推第三面
- ZCMU新人训练赛I
- 设计模式之观察者模式
- Unity UGUI 原理篇(三):RectTransform
- Codeforces 404C Restore Graph【思维】
- 浅谈lorawan 调试心得