J'essaie de créer un serveur http en Java qui est capable de fournir des connexions keep-alive. J'utilise la classe com.sun.net.httpserver.HttpServer.
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class httpHandler implements HttpHandler {
private String resp = "<?xml version='1.0'?><root-node></root-node>";
private OutputStream os = null;
public void handle(HttpExchange t) throws IOException {
System.out.println("Handling message...");
java.io.InputStream is = t.getRequestBody();
System.out.println("Got request body. Reading request body...");
byte[] b = new byte[500];
is.read(b);
System.out.println("This is the request: " + new String(b));
String response = resp;
Headers header = t.getResponseHeaders();
header.add("Connection", "Keep-Alive");
header.add("Keep-Alive", "timeout=14 max=100");
header.add("Content-Type", "application/soap+xml");
t.sendResponseHeaders(200, response.length());
if(os == null) {
os = t.getResponseBody();
}
os.write(response.getBytes());
System.out.println("Done with exchange. Closing connection");
os.close();
}
public static void main(String[] args) {
HttpServer server = null;
try {
server = HttpServer.create(new InetSocketAddress(8080), 5);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
server.createContext("/", new httpHandler());
server.setExecutor(null); // creates a default executor
System.out.println("Starting server...");
server.start();
}
}
Le client ne ferme pas la connexion. Le serveur semble la fermer directement après que l'échange ait eu lieu. J'ai essayé de supprimer la ligne os.close mais le serveur ne répond pas à la deuxième demande. Mais il ne la ferme pas non plus. J'ai l'impression que cela implique de faire quelque chose dans le code principal avec l'objet serveur mais je n'ai aucune idée de quoi. Google ne donne pas grand-chose non plus.
Quelqu'un ici a une idée ? Toute aide serait très appréciée.