JAVA网络编程之上传文件(TCP协议)

1.客户端

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();
}

注:此时传输的是字节,所以PrintStream要使用write()方法而不是println()方法 

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;
      }
   }
}

2.服务器

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();
   }
}

猜你喜欢

转载自blog.csdn.net/qq_40298054/article/details/88984051