帮我写一个java程序,模拟网站下载图片的功能,先让客户端给服务器发请求,告诉服务器要下载的文件名,然后服务器就给客户端传递文件,直至传递完成;**要求:** 1:服务器使用线程池完成,每次客户请求下载文件时,就使用一个线程与客户端交互; 2:要求客户端保存文件时文件名使用UUID随机生成; **效果:**
时间: 2023-05-17 14:04:58 浏览: 86
以下是一个简单的 Java 程序,可以模拟网站下载图片的功能:
```java
import java.io.*;
import java.net.*;
import java.util.UUID;
import java.util.concurrent.*;
public class ImageDownloader {
private static final int PORT = 8080;
private static final int THREAD_POOL_SIZE = 10;
public static void main(String[] args) throws IOException {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server started on port " + PORT);
while (true) {
Socket clientSocket = serverSocket.accept();
executor.execute(new ClientHandler(clientSocket));
}
}
private static class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String fileName = in.readLine();
System.out.println("Client requested file: " + fileName);
File file = new File(fileName);
if (!file.exists()) {
System.out.println("File not found: " + fileName);
return;
}
OutputStream out = clientSocket.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
InputStream fileIn = new FileInputStream(file);
while ((bytesRead = fileIn.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
fileIn.close();
out.close();
System.out.println("File sent to client: " + fileName);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static String generateRandomFileName() {
return UUID.randomUUID().toString();
}
}
```
这个程序使用了线程池来处理客户端请求,每次客户端请求下载文件时,就使用一个线程与客户端交互。客户端保存文件时文件名使用 UUID 随机生成。
注意:这个程序只是一个简单的示例,没有进行错误处理和安全性检查,实际使用时需要根据具体情况进行修改和完善。
阅读全文