网络IO 客户端向服务端上传文件 服务端多线程接收文件

本文详细介绍了客户端与服务器间文件上传的交互过程,包括客户端输入文件路径、验证有效性、发送文件名至服务器,以及服务器判断文件是否存在并接收文件的完整流程。

1.客户端向服务器上传文件
客户端
2.提示输入要上传的文件路径File,验证路径是否有效,以及是否是文件夹,
不存在或是文件夹都需要重新录入
3.发送文件名到服务器 File.getName
6.接收结果,如果存在给予提示,否则程序直接退出
7.如果不存在,定义FileInputStream读取文件,通过网络上传

服务器
1.建立多线程服务器
4.读取文件名
5.判断文件名是否存在,将结果返回给客户端
8.接收文件
import java.io.*;

import java.net.Socket;
import java.util.Scanner;

/**

  • * Created with IntelliJ IDEA.

  • * User: yfl

  • * Date: 2019/8/20

  • * Time: 23:11

  • * To change this template use File | Settings | File Templates.

  • * Description:


  • */
    //客户端
    public class Test01_Client {
    public static void main(String[] args) throws IOException {
    Socket socket = new Socket(“127.0.0.1”, 9999);
    //String file = getFile();
    String file = “E:\BD1904\src\com\briup\java\day20\note\note_day20”;
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintStream ps = new PrintStream(socket.getOutputStream());

     File filepath = new File(file);
     String name = filepath.getName();
    
     ps.println(name);
    
     //获取客户端的反馈
     String msg = br.readLine();
     if ("true".equals(msg)){
         System.out.println("服务器已经存在改文件,不需要再次发送");
         socket.close();
         return;
     }else if ("false".equals(msg)){
         //服务器不存在改文件,上传
         FileInputStream fis = new FileInputStream(filepath);
    
         int len;
         while ((len = fis.read())!=-1){
             ps.write(len);
         }
         fis.close();
         System.out.println("文件上传结束");
         socket.close();
    
     }
    

    }

    //从键盘通过路径名获取一个文件名
    public static String getFile() {
    Scanner sc = new Scanner(System.in);
    System.out.println(“请输入一个路径名”);

     String fileName = "E:\\BD1904\\src\\com\\briup\\java\\day20\\note\\note_day20";
     while (true) {
         fileName = sc.nextLine();
         File file = new File(fileName);
         if (!file.exists()) {
             System.out.println("路径名不存在,请重新输入");
         } else if (file.isDirectory()) {
             System.out.println("是文件夹,重新输入");
         }
         else {
             break;
         }
     }
     return fileName;
    

    }
    }

//服务端
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**

  • * Created with IntelliJ IDEA.

  • * User: yfl

  • * Date: 2019/8/20

  • * Time: 23:10

  • * To change this template use File | Settings | File Templates.

  • * Description:


  • */
    public class Test01_Server {
    public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(9999);
    System.out.println(“服务器已经启动…,端口:” + 9999);

     while (true){
         Socket socket = server.accept();
         String ip = socket.getInetAddress().getHostName();
         int port = socket.getPort();
         System.out.println("客户端..." + ip + ":" + port + "已连接");
    
         new Thread(){
             @Override
             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();
                     //去指定的服务器资源目录中查看文件是否存在
                     File file = new File("E:\\BD1904\\src\\com\\briup\\java\\day20\\upload", filename);
                     if (file.exists()){
                         System.out.println("客户端发送的文件名" + filename + "在本地资源中已经存在");
                         ps.println("true");
                         return;
                     }else {
                         //文件不存在,先发送一个标志,然后创建一个同名的本地文件
                         ps.println("false");
                         FileOutputStream fos = new FileOutputStream(file);
                         byte[] bytes = new byte[1024 * 8];
                         int len;
                         while ((len = is.read(bytes)) != -1){
                             fos.write(bytes,0,len);
                         }
                         fos.close();
                         System.out.println("读取数据完成,上传文件结束");
                     }
                 }catch (Exception e){
                     e.printStackTrace();
                 }finally {
                     if (socket == null){
                         try {
                             socket.close();
                         } catch (IOException e) {
                             e.printStackTrace();
                         }
                     }
                 }
             }
         }.start();
    
     }
    

    }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值