原理:文件的复制
客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上
步骤:
1、客户端使用本地的字节输入流,读取要上传的文件
2、客户端使用网路字节输出流,把读取的文件上传到服务器
3、服务器使用网络字节输入流,读取客户端上传的文件
4、服务器使用本地字节输出流,把读取到的文件,保存到服务器的硬盘上面
5、服务器使用网络字节输出流,给客户端会写一个“上传成功”
6、客户端使用网络字节输入流,读取服务器会写的数据
注意:
1、客户端服务器和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)
2、客户端服务器之间的读写,必须使用Socket中提供的字节流对象(网络流)
客户端:
服务器端:
文件上传时阻塞问题:
解决:上传完文件,给服务器写一个结束标记
void shutdownOutput():禁用此套接字的输出流
对应TCP套接字,任何一起写入的数据都将被发送,并且加上结束标记
socket.shutdownOutput();
优化:
1、自定义文件命名规则
2、让服务器一直处于监听状态,有一个客户端上传文件,就保存文件
while(true){}
3、启动多线程,上传一次文件,就开启一个线程。
注意:用多线程重写run后不能抛出异常,只能用try--catch
优化后代码:
客户端
服务器: