Java ServerSocket没有';你不能和资源一起工作吗?
所以我们在课堂上玩弄ServerSockets,制作一个非常简单的HTTP服务器,它接受一个请求,什么也不做,然后用200 OK和一些HTML内容进行响应 我两天来一直在努力解决这个问题,但我没能解决它,我的老师也没有。出于某种奇怪的原因,我开始认为关闭服务器是个问题。我已经解决了这个问题,但我只是想知道为什么我会这样做 以下是三个片段: HttpServer.class:Java ServerSocket没有';你不能和资源一起工作吗?,java,try-catch,serversocket,try-with-resources,Java,Try Catch,Serversocket,Try With Resources,所以我们在课堂上玩弄ServerSockets,制作一个非常简单的HTTP服务器,它接受一个请求,什么也不做,然后用200 OK和一些HTML内容进行响应 我两天来一直在努力解决这个问题,但我没能解决它,我的老师也没有。出于某种奇怪的原因,我开始认为关闭服务器是个问题。我已经解决了这个问题,但我只是想知道为什么我会这样做 以下是三个片段: HttpServer.class: package httpserver; import java.io.Closeable; import java.io
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();
}
}
}
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());
}
}
}
封装httpserver;
导入java.io.IOException;
导入java.net.Socket;
公共班机{
公共静态void main(字符串[]args)引发IOException{
HttpServer服务器=新的HttpServer();
套接字客户端;
while(true){
client=server.accept();
recieve();
响应(“HTTP/1.0 200正常\r\n”
+“内容类型:text/html\r\n”
+“\r\n”
+“你好……”;
client.close();
}
}
}
不起作用的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();
}
}
}
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());
}
}
}
封装httpserver;
导入java.io.IOException;
公共班机{
公共静态void main(字符串[]args){
try(HttpServer服务器=新的HttpServer()){
while(true){
accept();
recieve();
响应(“HTTP/1.0 200正常\r\n”
+“内容类型:text/html\r\n”
+“\r\n”
+“你好……”;
}
}捕获(IOEX异常){
println(“我们有一个问题:+ex.getMessage());
}
}
}
我可以想象它与每次循环迭代后不关闭客户机套接字有关。但即便如此,它至少应该经历一次,然后才会出现问题。我真的看不出问题出在哪里
无错误消息,无任何…发送HTTP时不指定任何错误消息,因此浏览器不知道何时停止读取更多数据。有关更多信息,请参阅
在工作示例中,您关闭了客户端套接字,它告诉浏览器没有更多数据-出于您的野心,如果您不希望浏览器响应,这可能就足够了。@G-Man
Closeable
extendsAutoCloseable
,所以它不是。您试过调试代码吗?@ChrisCooney我试过,但是我很不确定如何调试这样的东西。在某些情况下,NetBeans调试器并不是世界上最友好的调试器。你说“不工作”是什么意思?您在HttpServer类中实现HTTP的尝试是如此的不完整,以至于我很惊讶,即使是第一个主类也做了任何有用的事情。因为唯一的区别是第二个主类没有关闭网络套接字,所以我假设您的浏览器实际上在等待更多数据,并且似乎什么都不做。@jarnbjo它有什么不完整的地方?