除了
rn每个请求标头行之后,您还必须在标头之后发送一个空行。例:
out.write("HTTP/1.0 200 OKrn");// Header...out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMTrn");out.write("rn"); // The content starts afters this empty lineout.write("<TITLE>Hello!</TITLE>");// Content...我更正了您的代码,使其可以正常工作(但仍然不完美,您应该在单独的线程中处理每个请求,例如使用
java.util.concurrent.ThreadPoolExecutor):
public static void main(String[] args) throws Exception { // création de la socket int port = 1989; ServerSocket serverSocket = new ServerSocket(port); System.err.println("Serveur lancé sur le port : " + port); // repeatedly wait for connections, and process while (true) { // on reste bloqué sur l'attente d'une demande client Socket clientSocket = serverSocket.accept(); System.err.println("Nouveau client connecté"); // on ouvre un flux de converation BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); // chaque fois qu'une donnée est lue sur le réseau on la renvoi sur // le flux d'écriture. // la donnée lue est donc retournée exactement au même client. String s; while ((s = in.readLine()) != null) { System.out.println(s); if (s.isEmpty()) { break; } } out.write("HTTP/1.0 200 OKrn"); out.write("Date: Fri, 31 Dec 1999 23:59:59 GMTrn"); out.write("Server: Apache/0.8.4rn"); out.write("Content-Type: text/htmlrn"); out.write("Content-Length: 59rn"); out.write("Expires: Sat, 01 Jan 2000 00:59:59 GMTrn"); out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMTrn"); out.write("rn"); out.write("<TITLE>Exemple</TITLE>"); out.write("<P>Ceci est une page d'exemple.</P>"); // on ferme les flux. System.err.println("Connexion avec le client terminée"); out.close(); in.close(); clientSocket.close(); }}


