ServerSocket不能与try-with-resources一起使用?

时间:2013-03-06 13:53:29

标签: java try-catch serversocket try-with-resources

所以我们在课堂上搞砸了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());
        }
    }
}

我可以想象它与每次循环迭代后没有关闭客户端套接字有关。但即便如此,它至少应该经过一次,然后才能在这种情况下进行讨论。我真的看不出应该是什么问题。

没有错误消息,没有......

1 个答案:

答案 0 :(得分:1)

发送HTTP时未指定任何Content-length,因此浏览器不知道何时停止读取更多数据。有关详细信息,请参阅How to know when HTTP-server is done sending data

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