8.02_网络编程(客户端向服务器上传文件)

一、客户端代码

    public class Test2_UpdateClient {

      public static void main(String[] args) throws UnknownHostException, IOException {
        // 1.提示输入要上传的文件路径, 验证路径是否存在以及是否是文件夹
          File file = getFile();
        // 2.发送文件名到服务端
          Socket socket = new Socket("127.0.0.1", 12345);
          BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          PrintStream ps = new PrintStream(socket.getOutputStream());
          ps.println(file.getName());
        // 6.接收结果, 如果存在给予提示, 程序直接退出
          String result = br.readLine(); //读取存在后不存在的结果
          if("存在".equals(result)) {
          System.out.println("您上传的文件已经存在,请不要重复上传");
          socket.close();
          return;
        }
        // 7.如果不存在, 定义FileInputStream读取文件, 写出到网络
          FileInputStream fis = new FileInputStream(file);
          byte[] arr = new byte[8192];
            int len;

          while((len = fis.read(arr)) != -1) {
            ps.write(arr, 0, len);
            }

            fis.close();
          socket.close();
        }

        private static File getFile() {
          Scanner sc = new Scanner(System.in); //创建键盘录入对象
          System.out.println("请输入一个文件路径:");

            while(true) {
              String line = sc.nextLine();
              File file = new File(line);

              if(!file.exists()) {
              System.out.println("您录入的文件路径不存在,请重新录入:");
              }else if(file.isDirectory()) {
              System.out.println("您录入的是文件夹路径,请输入一个文件路径:");
              }else {
              return file;
              }
            }
          }
      }

二、服务器端代码

      public static void main(String[] args) throws IOException {
        //3,建立多线程的服务器
        ServerSocket server = new ServerSocket(12345);
        System.out.println("服务器启动,绑定12345端口号");

        //4.读取文件名
        while(true) {
          final Socket socket = server.accept(); //接受请求
            new Thread() {
            public void run() {
              try {
                InputStream is = socket.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                PrintStream ps = new PrintStream(socket.getOutputStream());
                String fileName = br.readLine();

                //5.判断文件是否存在, 将结果发回客户端
                File dir = new File("update");
                dir.mkdir(); //创建文件夹
                File file = new File(dir,fileName); //封装成File对象

                if(file.exists()) { //如果服务器已经存在这个文件
                  ps.println("存在"); //将存在写给客户端
                  socket.close(); //关闭socket
                  return;
                  }else {
                      ps.println("不存在");
                  }

              //8.定义FileOutputStream, 从网络读取数据, 存储到本地
              FileOutputStream fos = new FileOutputStream(file);
              byte[] arr = new byte[8192];
              int len;

              while((len = is.read(arr)) != -1) {
                fos.write(arr, 0, len);
                }

                fos.close();
                socket.close();
                } catch (IOException e) {

                  e.printStackTrace();
                }
              }
            }.start();
        }



      }
    }

posted @ 2020-03-11 09:57  mz张洋洋  阅读(155)  评论(0编辑  收藏  举报