1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.jot.web.server.impl; import java.net.ServerSocket; import java.net.Socket; import java.util.Hashtable; import java.util.Vector; import net.jot.logger.JOTLogger; import net.jot.logger.JOTLoggerLocation; import net.jot.web.server.JOTServerRequestHandler; import net.jot.web.server.JOTSessionManager; /** * Mini generic web server (regular- not j2ee) * Use together with JOTWebRequestHandlerBase for easy request processing * * Ex: server=new JOTMiniWebServer(); * server.start(8033,MYJOTConfiguratorHandler.class); * @author thibautc */ public class JOTMiniServer { // Vector is synchronized. private Vector threads = new Vector(); volatile boolean stop = false; ServerSocket socket = null; JOTLoggerLocation logger=new JOTLoggerLocation(JOTLogger.CAT_SERVER,getClass()); public JOTMiniServer() { JOTLogger.initIfNecessary("server.log", JOTLogger.ALL_LEVELS, null); } /** * Start the server on the given port * RequestHandler is the implem. to handle the requests * for simplicity, just provide a subclass impl. of JOTWebRequestHandlerBase * @param port * @param handler * @param params: Optionnals params that will be passed to the requestImpl * @throws java.lang.Exception */ public void start(int port, Class jOTServerRequestHandlerImplClass, Hashtable params) throws Exception { socket = new ServerSocket(port); while (socket != null && !stop) { Socket client = socket.accept(); logger.trace("New Connection from: " + client.getRemoteSocketAddress()); JOTServerRequestHandler handler=(JOTServerRequestHandler)jOTServerRequestHandlerImplClass.newInstance(); handler.init(params); RequestThread c = new RequestThread(client, handler); threads.add(c); c.run(); } } public void finalyze() throws Throwable { stop(); super.finalize(); } public void stop() { logger.debug("Stopping server."); stop = true; for (int i = 0; i != threads.size(); i++) { RequestThread c = (RequestThread) threads.get(i); if (c != null) { c.stop(); } } JOTSessionManager.shutdown(); } /** * Individual request thread */ class RequestThread implements Runnable { private Socket socket; private JOTServerRequestHandler handler; public RequestThread(Socket socket, JOTServerRequestHandler handler) { this.socket = socket; this.handler = handler; } public void run() { try { handler.handle(socket); } catch (Exception e) { logger.exception("Unhandled request processing error", e); } finally { try { socket.close(); } catch (Exception e2) { } threads.remove(this); } } public void stop() { try { if (socket != null && !socket.isClosed()) { socket.getInputStream().close(); socket.close(); } super.finalize(); } catch (Throwable t) { // not important } } } }