Java网络编程文件上传简单案例及优化

流程简单分析

  1. 【客户端】输入流,从硬盘读取文件数据到程序中。
  2. 【客户端】输出流,写出文件数据到服务端。
  3. 【服务端】输入流,读取文件数据到服务端程序。
  4. 【服务端】输出流,写出文件数据到服务器硬盘中。

在这里插入图片描述

客户端实现

public class C_Test_02 {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket(InetAddress.getLocalHost(),8888);
            // 创建输入缓冲流,读取本地文件
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("E:\\aaa.txt"));
            // 创建输出流,用于向服务端发送文件
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
            // 读取并写入数据
            byte[] bytes = new byte[1024];
            int len ;
            while ((len = bufferedInputStream.read(bytes))!=-1){
                bufferedOutputStream.write(bytes,0,len);
                bufferedOutputStream.flush();
            }
            // 关闭连接关闭输出输出流
            socket.close();
            bufferedOutputStream.close();
            bufferedInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端实现

public class S_Test_02 {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            Socket accept = serverSocket.accept();
            // 创建输入流,用于接受客户端的文件
            BufferedInputStream bufferedInputStream = new BufferedInputStream(accept.getInputStream());
            // 创建输出流,将客户端的文件保存到本地
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("E:\\bbb.txt"));
            // 读取并保存文件
            byte[] bytes = new byte[1024];
            int len ;
            while ((len = bufferedInputStream.read(bytes))!=-1){
                bufferedOutputStream.write(bytes,0,len);
                bufferedOutputStream.flush();
            }
            // 关闭连接,关闭输入输出流
            serverSocket.close();
            bufferedOutputStream.close();
            bufferedInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
优化分析

文件名称写死问题

使用系统时间对文件进行重命名,保证文件名称唯一,避免覆盖文件导致最终服务端硬盘只保留一个文件

BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("E:\\"+System.currentTimeMillis()+".txt"));

循环接收问题

服务端接收一个文件就关闭了,之后用户便无法上传,这很不符合实际,使用循环进行改进,可以不断接收来自客户端的文件

// 每次接收新的连接,创建一个Socket
whiletrue{
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket accept = serverSocket.accept();
    ......
}

效率问题

服务端,在接收大文件时,可能耗费几秒钟的时间,此时不能接收其他用户上传,所以,使用多线程技术优化,代码如下:

whiletrue{
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket accept = serverSocket.accept();
    // accept 交给子线程处理.
    new Thread(() -> {
      	......
        InputStream bis = accept.getInputStream();
      	......
    }).start();
}

修改后的

public class S_Test_02 {
    public static void main(String[] args) {
        try {
            while (true){
                ServerSocket serverSocket = new ServerSocket(8888);
                Socket accept = serverSocket.accept();
                new Thread(()->{
                    try{
                        // 创建输入流,用于接受客户端的文件
                        BufferedInputStream bufferedInputStream = new BufferedInputStream(accept.getInputStream());
                        // 创建输出流,将客户端的文件保存到本地
                        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("E:\\培训\\day0901\\"+System.currentTimeMillis()+".txt"));
                        // 读取并保存文件
                        byte[] bytes = new byte[1024];
                        int len ;
                        while ((len = bufferedInputStream.read(bytes))!=-1){
                            bufferedOutputStream.write(bytes,0,len);
                            bufferedOutputStream.flush();
                        }
                        // 关闭连接,关闭输入输出流
                        serverSocket.close();
                        bufferedOutputStream.close();
                        bufferedInputStream.close();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值