基于IO流的模拟下载文件的操作

一、创建服务器端

public class DownloadServer {
    public static void main(String[] args) throws Exception{
        ServerSocket server=new ServerSocket(55021);
        while(true){
            Socket socket=server.accept();
            System.out.println("连接建立成功!");
            //创建接受客户端发送来的字符输入流对象
            BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //创建字符输出流对象
            PrintWriter pw=new PrintWriter(socket.getOutputStream());
            StringBuilder sbu=new StringBuilder();
            String s=br.readLine();
            if(s.equals("image")){
                //创建文件对象
                File file=new File("service");
                File[] files = file.listFiles();
                for(File f:files){
                    System.out.print(f.getName()+"\t");
                    sbu.append(f.getName()+",");
                }
                pw.println(sbu);
                pw.flush();
                br.close();
                pw.close();
            }else{
                File file=new File("service/"+s);
                //创建二进制输入流对象,读取目录下的文件
                DataInputStream dis=new DataInputStream(new FileInputStream(file));
                //创建二进制输出流对象,向客户端发送数据
                DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
                byte[] bytes=new byte[1024];
                int data;
                //读取目录下的文件并向客户端输出二进制流
                while((data=dis.read(bytes))!=-1){
                    dos.write(bytes, 0,data);
                }
                dos.close();
                dis.close();
                br.close();
                socket.close();
            }
        }

    }
}

二、创建客户端

public class DownloadClient {
   static Socket socket;
    public static void main(String[] args) throws Exception{
        Scanner input=new Scanner(System.in);
        System.out.println("1.图片\t2.视频\t3.音乐");
        System.out.print("请选择序号:");
        int num=input.nextInt();
        switch(num){
            case 1:
                String[] str=getName();
                for(int i=1;i<=str.length;i++){
                    System.out.print(i+","+str[i-1]+"\t");
                }
                System.out.print("\n请选择你要下载的图片序号:");
                int num2=input.nextInt();
                download(str[num2-1]);
                break;
            case 2:
                break;
            case 3:
                break;
        }
    }
    public static String[] getName() throws Exception{
        //创建socket对象
        socket=new Socket("127.0.0.1",55021);
        PrintWriter pw=new PrintWriter(socket.getOutputStream());
        pw.println("image");
        pw.flush();
        //获取服务端传过来的数据
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String s=br.readLine();
        br.close();
        pw.close();
        socket.close();
        return s.split(",");
    }
    public static void download(String name) throws Exception {
        socket=new Socket("127.0.0.1",55021);
        PrintWriter pw=null;
        DataInputStream dis=null;
        DataOutputStream dos = null;
        try {
            //创建输出流,并发送要下载的图片名称
            pw = new PrintWriter(socket.getOutputStream());
            pw.println(name);
            pw.flush();
            //接受客户端发送来的二进制流
            dis=new DataInputStream(socket.getInputStream());
            //要写入的文件路径和写入方式
            dos=new DataOutputStream(new FileOutputStream("download/"+name,true));
            byte[] bytes=new byte[1024];
            int data;
            //读取二进制流并复制
            while((data=dis.read(bytes))!=-1){
                dos.write(bytes,0,data);
            }

        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                dos.close();
                dis.close();
                pw.close();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/TFE-HardView/p/11098424.html