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)