【JavaSE】文件上传案例详解优化(18)

引言

🥇距离开学还有38天,我还是没有底气
🥇我对体制内的人的刻板印象好像是表面朴素,暗地敛财手段层出不穷;

案例概述

我们假定C盘为我们的客户端硬盘位置,D盘为服务器端的硬盘;把C盘中的文件传输到D盘。

初步实现

文件上传客户端

实现步骤
1.创建一个Socket对象;
2.使用本地字节输入流(FileInputStream),从本地读取文件;
3.创建网络字节输出流(getOutputStream()),把文件传输到服务器;
4.使用网络字节输入流(getInputStream),从服务器中读取响应信息;
5.释放资源(Socket,本地字节输入流);

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Demo01Client {
    public static void main(String[] args) throws IOException {
        FileInputStream  fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\客户端\\高效(六).pdf");
        Socket   socket=new Socket("127.0.0.1",8888);
        OutputStream outputStream = socket.getOutputStream();
        int len=0;
        byte[] bts=new byte[1024];
        while((len=fis.read(bts))!=-1){
            outputStream.write(bts,0,len);
        }
        InputStream inputStream = socket.getInputStream();
         int len1=inputStream.read(bts);
        System.out.println(new String(bts,0,len1));
        fis.close();
        socket.close();
    }
}

文件上传服务器端

实现步骤
1.创建一个ServerSocket对象,用accept()方法创建一个Socket对象;
2.创建网络字节输入流,把客户端传来的文件读取到服务器;
3.创建本地字节输出流,把服务器上的文件输出到硬盘;
4.使用网络字节输出流,对服务器做出回应;
5.释放资源(ServerSocket,FileOutputStream,Socket)

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo01FileServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server =new ServerSocket(8888);
        Socket socket = server.accept();
        InputStream inputStream = socket.getInputStream();

        File file=new File("C:\\Users\\Administrator\\Desktop\\服务端\\高效");
        file.mkdirs();
        //判断路径是否存在
        byte[] bts=new byte[1024];
        int len=0;
        FileOutputStream os=new FileOutputStream(file+"\\1.pdf");
        while((len=inputStream.read(bts))!=-1){
            os.write(bts,0,len);
        }
        OutputStream outputStream=socket.getOutputStream();
        outputStream.write("收到了pdf文件".getBytes());
        socket.close();
        os.close();
        server.close();
    }
}

测试结果
在这里插入图片描述
你会发现文件是传输成功了,但是两个程序都没有终止,而且控制台也没有输出服务器的回应;

问题分析

在这里插入图片描述
解决方法
使用Socket中的shutdownOutout() 方法;
对于TCP套接字,任何先前写入的数据将被发送,随后添加一个TCP的 正常连接终止序列

案例优化

1.让服务器一直处于运行状态,只要客户端上传文件,服务器就能随时响应;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo01FileServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server =new ServerSocket(8888);
        //服务器不能重复创建,所以在循环外侧
       while(true){

           Socket socket = server.accept();
           InputStream inputStream = socket.getInputStream();

           File file=new File("C:\\Users\\Administrator\\Desktop\\服务端\\高效");
           file.mkdirs();
           //判断路径是否存在
           byte[] bts=new byte[1024];
           int len=0;
           FileOutputStream os=new FileOutputStream(file+"\\"+System.currentTimeMillis()+".pdf");
           System.out.println("333333333333333333333");
           while((len=inputStream.read(bts))!=-1){
               os.write(bts,0,len);
           }
           //用这种方法读取,使效率提高
           System.out.println("444444444444444444");
           OutputStream outputStream=socket.getOutputStream();
           outputStream.write("收到了pdf文件".getBytes());
           socket.close();
           os.close();
       }
//服务器不用关闭了;
    }
}

2.利用线程提高服务器效率


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo01FileServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server =new ServerSocket(8888);
       while(true){
          new Thread(new Runnable() {
              @Override
              public void run() {
                  try {
                      Socket socket = server.accept();
                      InputStream inputStream = socket.getInputStream();

                      File file=new File("C:\\Users\\Administrator\\Desktop\\服务端\\高效");
                      file.mkdirs();
                      //判断路径是否存在
                      byte[] bts=new byte[1024];
                      int len=0;
                      FileOutputStream os=new FileOutputStream(file+"\\"+System.currentTimeMillis()+".pdf");
                      while((len=inputStream.read(bts))!=-1){
                          os.write(bts,0,len);
                      }
                      //用这种方法读取,使效率提高
                    
                      OutputStream outputStream=socket.getOutputStream();
                      outputStream.write("收到了pdf文件".getBytes());
                      socket.close();
                      os.close();
                  }catch (IOException E){
                      E.printStackTrace();
                  }
              }
          }).start();

       }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值