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();        }    }}
原创粉丝点击