原理:文件的复制

客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上

步骤:

1、客户端使用本地的字节输入流,读取要上传的文件

2、客户端使用网路字节输出流,把读取的文件上传到服务器

3、服务器使用网络字节输入流,读取客户端上传的文件

4、服务器使用本地字节输出流,把读取到的文件,保存到服务器的硬盘上面

5、服务器使用网络字节输出流,给客户端会写一个“上传成功”

6、客户端使用网络字节输入流,读取服务器会写的数据

注意:

1、客户端服务器和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)

2、客户端服务器之间的读写,必须使用Socket中提供的字节流对象(网络流)

【java笔记】网络编程:文件上传案例_客户端

客户端:

FileInputStream fis=new FileInputStream("d:\\a.txt");
     Socket socket=new Socket("127.0.0.1",8888);
     OutputStream os=socket.getOutputStream();
     byte[]bytes=new byte[1024];
     int len=0;
     while((len=fis.read(bytes))!=-1){
          os.write(bytes,0,len);
        }
     byte[]bytes1=new byte[1024];
     InputStream is=socket.getInputStream();
     while((len=is.read(bytes1))!=-1){
         System.out.println(new String(bytes1,0,len));
        }
     fis.close();
     socket.close();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

服务器端:

ServerSocket serverSocket=new ServerSocket(8888);
    Socket socket=serverSocket.accept();
    InputStream is= socket.getInputStream();
    byte[]bytes=new byte[1024];
    int len=0;
    FileOutputStream fos=new FileOutputStream("d:\\b.txt");
    while((len=is.read(bytes))!=-1){
         fos.write(bytes,0,len);
    }
    socket.getOutputStream().write("上传完毕".getBytes(StandardCharsets.UTF_8));
    socket.close();
    fos.close();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

文件上传时阻塞问题:

【java笔记】网络编程:文件上传案例_上传_02

 解决:上传完文件,给服务器写一个结束标记

void shutdownOutput():禁用此套接字的输出流

对应TCP套接字,任何一起写入的数据都将被发送,并且加上结束标记


socket.shutdownOutput();


 优化:

1、自定义文件命名规则

String fileName=System.currentTimeMillis()+new Random().NextInt+".txt";
  • 1.

2、让服务器一直处于监听状态,有一个客户端上传文件,就保存文件

while(true){}

3、启动多线程,上传一次文件,就开启一个线程。

注意:用多线程重写run后不能抛出异常,只能用try--catch

优化后代码:

客户端

FileInputStream fis=new FileInputStream("d:\\a.txt");
     Socket socket=new Socket("127.0.0.1",8888);
     OutputStream os=socket.getOutputStream();
     byte[]bytes=new byte[1024];
     int len=0;
     while((len=fis.read(bytes))!=-1){
          os.write(bytes,0,len);
        }
     socket.shutdownOutput();
     byte[]bytes1=new byte[1024];
     InputStream is=socket.getInputStream();
     while((len=is.read(bytes1))!=-1){
         System.out.println(new String(bytes1,0,len));
        }
     fis.close();
     socket.close();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

服务器:
 

ServerSocket serverSocket=new ServerSocket(8888);
    while(true) {
    Socket socket = serverSocket.accept();
    String name = System.currentTimeMillis() + new Random().nextInt(9999) + ".txt";
    FileOutputStream fos = new FileOutputStream("d:" + "\\" + name);
    new Thread(()->{
        try {
            InputStream is = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = 0;


            while ((len = is.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
            socket.getOutputStream().write("上传完毕".getBytes(StandardCharsets.UTF_8));

        }catch (IOException e){
            System.out.println(e);
        }
        finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.