所以我们在课堂上搞砸了ServerSockets,制作了一个非常简单的HTTP服务器,它接受请求,对它没有任何作用,并且响应200 OK,然后是一些HTML内容。
我一直试图弄清楚这个问题已经两天了,而且我无法掌握它,我的老师也没有。由于一些奇怪的原因,我认为关闭服务器是一个问题。我已经解决了这个问题,但我想知道我为什么会这么做。
以下是三个片段:
HttpServer.class:
package httpserver;
import java.io.Closeable;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class HttpServer implements Closeable {
public static final int PORT = 80;
public static final int BACKLOG = 1;
public static final String ROOT_CATALOG = "C:/HttpServer/";
private ServerSocket server;
private Socket client;
private Scanner in;
private PrintWriter out;
private String request;
public HttpServer() throws IOException {
server = new ServerSocket(PORT, BACKLOG);
}
public Socket accept() throws IOException {
client = server.accept();
in = new Scanner(client.getInputStream());
out = new PrintWriter(client.getOutputStream());
return client;
}
public void recieve() {
request = in.nextLine();
System.out.println(request);
}
public void respond(final String message) {
out.print(message);
out.flush();
}
@Override
public void close() throws IOException {
if(!server.isClosed()) {
client = null;
server = null;
}
}
}
的主要解决方案 :
package httpserver;
import java.io.IOException;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
HttpServer server = new HttpServer();
Socket client;
while(true) {
client = server.accept();
server.recieve();
server.respond("HTTP/1.0 200 OK\r\n"
+ "Content-Type: text/html\r\n"
+ "\r\n"
+ "<html><body><b>hello..</b></body></html>");
client.close();
}
}
}
不起作用的Main.class解决方案 :
package httpserver;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try(HttpServer server = new HttpServer()) {
while (true) {
server.accept();
server.recieve();
server.respond("HTTP/1.0 200 OK\r\n"
+ "Content-Type: text/html\r\n"
+ "\r\n"
+ "<html><body><b>hello..</b></body></html>");
}
} catch(IOException ex) {
System.out.println("We have a problem: " + ex.getMessage());
}
}
}
我可以想象它与每次循环迭代后没有关闭客户端套接字有关。但即便如此,它至少应该经过一次,然后才能在这种情况下进行讨论。我真的看不出应该是什么问题。
没有错误消息,没有......
答案 0 :(得分:1)
发送HTTP时未指定任何Content-length,因此浏览器不知道何时停止读取更多数据。有关详细信息,请参阅How to know when HTTP-server is done sending data。
在工作示例中,您关闭了客户端套接字,告诉浏览器没有更多数据 - 如果您不希望浏览器做出响应,这可能就足够了。