1

I'm trying build a simple Java HTTP server in Java 1.8. A http client should request the server to process a file, and after a few minutes once the processing if over, the server should return a response message to the client (so it's not immediate response). The client is a browser with a form and a submit button. After the few minutes, it should get the response back and show it.

I implemented this with com.sun.net.httpserver.HttpServer and its HttpHandler class like this. I sent an ack response right after getting the HTTP request which works. But when I want to send back a second response after a few minutes past processing, it shows an StreamClosedException error.

How can I fix it?

    public void run() {
        try {
            server = HttpServer.create(new InetSocketAddress(serverPort), 0);
            System.out.println("REST server listening to port: " + serverPort);
            server.createContext("/server", new PostHandler());
            server.setExecutor(null);
            server.start();
        } catch (IOException e) {
            System.err.println("HttpServer ERROR");
        }
    }

    class PostHandler implements HttpHandler {
            public void handle(HttpExchange he) throws IOException {
                // parse request
                InputStreamReader isr = new InputStreamReader(he.getRequestBody(), "utf-8");
                BufferedReader br = new BufferedReader(isr);
                // ---- some vars
                try {
                String response="ack";
                he.sendResponseHeaders(200, response.length());
                OutputStream os = he.getResponseBody();
                os.write(response.toString().getBytes());

// After a few minutes of file processing ...

                response="ok: "+ SomeIntegers;
                os.write(response.toString().getBytes());
                System.out.println(response);

            } catch (Exception e) {
                e.printStackTrace();                
            }
        }
}

And the error stack trace:

sun.net.httpserver.StreamClosedException
    at jdk.httpserver/sun.net.httpserver.FixedLengthOutputStream.write(FixedLengthOutputStream.java:75)
    at java.base/java.io.FilterOutputStream.write(FilterOutputStream.java:108)
    at jdk.httpserver/sun.net.httpserver.PlaceholderOutputStream.write(ExchangeImpl.java:459)
    at microsoft.hack.ffmpegserver.FFmpegServer$PostHandler.handle(Server.java:121)
    at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:98)
    at jdk.httpserver/sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:82)
    at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:101)
    at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:736)
    at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:98)
    at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:703)
    at jdk.httpserver/sun.net.httpserver.ServerImpl$DefaultExecutor.execute(ServerImpl.java:162)
    at jdk.httpserver/sun.net.httpserver.ServerImpl$Dispatcher.handle(ServerImpl.java:450)
    at jdk.httpserver/sun.net.httpserver.ServerImpl$Dispatcher.run(ServerImpl.java:416)
    at java.base/java.lang.Thread.run(Thread.java:833)
Mary
  • 393
  • 1
  • 4
  • 17

0 Answers0