Advertisement
Help Keep Boards Alive. Support us by going ad free today. See here: https://subscriptions.boards.ie/.
If we do not hit our goal we will be forced to close the site.

Current status: https://keepboardsalive.com/

Annual subs are best for most impact. If you are still undecided on going Ad Free - you can also donate using the Paypal Donate option. All contribution helps. Thank you.
https://www.boards.ie/group/1878-subscribers-forum

Private Group for paid up members of Boards.ie. Join the club.

HTTP server capable of Keep-Alive

  • 20-12-2007 06:33PM
    #1
    Registered Users, Registered Users 2 Posts: 590 ✭✭✭


    Hi,

    I'm trying to create a http server in Java which is capable of providing keep-alive connections. I'm using the com.sun.net.httpserver.HttpServer class.

    Here's my code:
    package Test;
    
    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();
    	}
    }
    

    The client does not close the connection. The server seems to close it instead directly after the exchange has occurred. I tried deleting the os.close line but then the server will not reply to the second request. But it doesn't close it either. I have a feeling it involves doing something in the main code with the server object but I have no idea what. Google isn't turning up much either.

    Anyone here got any ideas? Any help would be much appreciated.


Advertisement