Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServerSocket没有';你不能和资源一起工作吗?_Java_Try Catch_Serversocket_Try With Resources - Fatal编程技术网

Java ServerSocket没有';你不能和资源一起工作吗?

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

所以我们在课堂上玩弄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();
        }
    }
}
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
extends
AutoCloseable
,所以它不是。您试过调试代码吗?@ChrisCooney我试过,但是我很不确定如何调试这样的东西。在某些情况下,NetBeans调试器并不是世界上最友好的调试器。你说“不工作”是什么意思?您在HttpServer类中实现HTTP的尝试是如此的不完整,以至于我很惊讶,即使是第一个主类也做了任何有用的事情。因为唯一的区别是第二个主类没有关闭网络套接字,所以我假设您的浏览器实际上在等待更多数据,并且似乎什么都不做。@jarnbjo它有什么不完整的地方?