Я попытался реализовать простой HTTP-сервер с сокетом на Java. То, что он делает, - это принять имя файла из клиентского браузера, открыть этот файл на диске и распечатать его в браузере. Мой текущий код показан ниже:Реализация HTTP-сервера с помощью Socket - как сохранить его навсегда?
public class HTTPServer {
public String getFirstLine(Scanner s) {
String line = "";
if (s.hasNextLine()) {
line = s.nextLine();
}
if (line.startsWith("GET /")) {
return line;
}
return null;
}
public String getFilePath(String s) {
int beginIndex = s.indexOf("/");
int endIndex = s.indexOf(" ", beginIndex);
return s.substring(beginIndex + 1, endIndex);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
Socket clientSocket = null;
int serverPort = 7777; // the server port
try {
ServerSocket listenSocket = new ServerSocket(serverPort);
while (true) {
clientSocket = listenSocket.accept();
Scanner in;
PrintWriter out;
HTTPServer hs;
in = new Scanner(clientSocket.getInputStream());
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())));
hs = new HTTPServer();
// get the first line
String httpGetLine = hs.getFirstLine(in);
if (httpGetLine != null) {
// parse the file path
String filePath = hs.getFilePath(httpGetLine);
// open the file and read it
File f = new File(filePath);
if (f.exists()) {
// if the file exists, response to the client with its content
out.println("HTTP/1.1 200 OK\n\n");
out.flush();
BufferedReader br = new BufferedReader(new FileReader(filePath));
String fileLine;
while ((fileLine = br.readLine()) != null) {
out.println(fileLine);
out.flush();
}
} else {
out.println("HTTP/1.1 404 NotFound\n\nFile " + filePath + " not found.");
out.flush();
}
}
}
} catch (IOException e) {
System.out.println("IO Exception:" + e.getMessage());
} finally {
try {
if (clientSocket != null) {
clientSocket.close();
}
} catch (IOException e) {
// ignore exception on close
}
}
}
}
После того как я запустить его в NetBeans, открыть браузер и посетить «локальный: 7777/hello.html» (hello.html файл в папке проекта). Он просто показывает, что страница загружается. Только после того, как я остановлю свой сервер в NetBeans, содержимое hello.html будет показано в браузере.
Я хочу, чтобы мой сервер работал бесконечно, отвечал на запросы GET один за другим и отображал клиенту содержимое файла. Я не уверен, какие части моего кода должны быть помещены в цикл while(true)
, а какие нет.
Лучше переформулируйте свой ответ. Ответы, которые в основном содержат вопросительные знаки, можно легко воспринимать как «не ответ» ;-) – GhostCat