首页 云服务 DNS dns FTP 操作系统

当前位置:首页 > 服务器 > Java实现服务器指定目录

Java实现服务器指定目录

发布时间:2024-07-02 11:21:24 作者:钟季掣
在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,来构建服务器。