gpt4 book ai didi

java - ServerSocket 不适用于 try-with-resources?

转载 作者:行者123 更新时间:2023-11-30 11:35:12 25 4
gpt4 key购买 nike

所以我们在类里面玩弄 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;
}
}
}

有效的 Main.class 解决方案:

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());
}
}
}

我可以想象这与在每次循环迭代后不关闭客户端套接字有关。但即便如此,在出现故障之前,它至少应该经过一次。我真的看不出问题出在哪里。

没有错误信息,没有...

最佳答案

您没有指定任何 Content-length发送 HTTP 时,浏览器不知道何时停止读取更多数据。参见 How to know when HTTP-server is done sending data获取更多信息。

在工作示例中,您关闭了客户端套接字,它告诉浏览器没有更多数据 - 如果您不希望浏览器响应,这可能就足够了。

关于java - ServerSocket 不适用于 try-with-resources?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15249169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com