一、文件上传优化分析
- 客户端服务端关闭的问题
socket.shutdownOutput();
- 文件名称写死的问题
服务端,保存文件的名称如果写死,那么最终导致服务器硬盘,只会保留一个文件,建议使用系统时间优化,保证文件名称唯一,代码如下:
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis()+".jpg")
BufferedOutputStream bos = new BufferedOutputStream(fis);
- 循环接收的问题
服务端,指保存一个文件就关闭了,之后的用户无法再上传,这是不符合实际的,使用循环改进,可以不断的接收不同用户的文件
while(true){
Socket accept = serverSocket.accept();
......
}
- 效率问题
服务端,在接收大文件时,可能耗费几秒钟的时间,此时不能接收其他用户上传,所以,使用多线程技术优化。
while(true){
Socket accept = serverSocket.accept();
new Thread(() -> {
......
InputStream bis = accept.getInputStream();
......
}).start();
}
二、优化代码实现
class FileUpload_Thread implements Runnable{
private Socket socket;
private File file;
public FileUpload_Thread(Socket accept,File f){
socket = accept;
file = f;
}
@Override
public void run() {
try{
InputStream is = socket.getInputStream();
String fileName = "File" + new Random().nextInt(99999) + ".jpg";
FileOutputStream fos = new FileOutputStream(file + "\\" + fileName);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
socket.getOutputStream().write("上传成功".getBytes());
fos.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
public class FileUpload_Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
File file = new File("E:\\upload");
if(!file.exists()) file.mkdirs();
while(true){
Socket socket = server.accept();
FileUpload_Thread ft = new FileUpload_Thread(socket,file);
Thread t = new Thread(ft);
t.start();
}
}
}
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
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62