在Java中,实现一个简单的服务器来指定目录并处理请求,你可以使用java.net.ServerSocket和java.io包中的类。
以下是一个简单的例子,演示了如何创建一个服务器,它监听特定的端口,并能够处理HTTP请求,当请求是目录时,服务器会列出该目录的内容。
java
import java.io.;
import java.net.;
import java.util.;
import java.util.stream.Collectors;
public class SimpleHttpServer {
public static void main(String[] args) throws IOException {
int port = 8080; // 服务器端口
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器启动,监听端口:" + port);
while (true) {
try {
Socket clientSocket = serverSocket.accept();
handleClient(clientSocket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void handleClient(Socket clientSocket) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
String requestLine = in.readLine();
if (requestLine == null) {
clientSocket.close();
return;
}
String[] requestParts = requestLine.split(" ");
String method = requestParts[0];
String path = requestParts[1];
if (method.equals("GET")) {
File file = new File(path);
if (file.isDirectory()) {
sendDirectoryList(out, file);
} else {
sendFile(out, file);
}
}
in.close();
out.close();
clientSocket.close();
}
private static void sendDirectoryList(DataOutputStream out, File directory) throws IOException {
List
entries = Arrays.stream(directory.list())
.filter(name -> !name.equals(".") && !name.equals(".."))
.collect(Collectors.toList());
String response = "HTTP/1.1 200 OK\r\nContent-Type: text/\r\n\r\n";
response += "Directory List
";
for (String entry : entries) {
response += "- " + entry + "
";
}
response += "
>";
out.writeBytes(response);
}
private static void sendFile(DataOutputStream out, File file) throws IOException {
String contentType = getContentType(file);
String response = "HTTP/1.1 200 OK\r\nContent-Type: " + contentType + "\r\nContent-Length: " + file.length() + "\r\n\r\n";
try (InputStream fileInputStream = new FileInputStream(file)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
out.writeBytes(response);
}
private static String getContentType(File file) {
String fileName = file.getName();
int dotIndex = fileName.lastIndexOf('.');
if (dotIndex == -1) return "application/octet-stream";
String extension = fileName.substring(dotIndex + 1).toLowerCase();
switch (extension) {
case "":
case "htm":
return "text/";
case "css":
return "text/css";
case "js":
return "application/javascript";
case "png":
case "jpg":
case "jpeg":
case "gif":
return "image/" + extension;
case "txt":
return "text/plain";
// Add more cases for other content types as needed.
default:
return "application/octet-stream";
}
}
}
这个服务器会在指定的端口(默认是8080)上启动,并监听HTTP GET请求。
当请求的是一个目录时,它会发送一个HTML页面,列出目录中的文件。
如果请求的是一个文件,它会发送该文件的内容。
请注意,这个服务器是非常基础的,没有实现HTTP协议的完整功能,也没有进行错误处理或安全性考虑。
在实际应用中,你应该使用成熟的框架,如Jetty或Tomcat,来构建服务器。
![](https://img1.baidu.com/it/u=1956157804,1955332485&fm=253.jpg)