Webbit
Evented, single-threaded WebSocket server @aslak_hellesoy
http://webbitserver.org/
Webbit Evented, single-threaded WebSocket server - - PowerPoint PPT Presentation
Webbit Evented, single-threaded WebSocket server http://webbitserver.org/ @aslak_hellesoy Webbit Overview Single threaded Non-blocking High throughput 1000+ connections No Servlet API No XML 1 Dependency: Netty
http://webbitserver.org/
HttpHandler WebServer HttpHandler HttpHandler
public class MyHttpHandler implements HttpHandler { public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) { if(req.headers("Accept").contains("text/plain")) { res.header("Content-Type", "text/plain"); res.content("Hello"); res.end(); } else { ctl.nextHandler(); } } }
public static void main(String[] args) { WebServer server = new NettyWebServer(8080); server.add(new MyHttpHandler()); server.start(); }
HTTP
request response
WebSocket
messages
EventSource
messages
GET /ws HTTP/1.1 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Version: 13 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlmm5OPpG2HaGWk= Frames (UTF-8 or binary) can go both ways, asynchronously
var ws = new WebSocket('ws://my.host/path'); ws.onconnect = function() { ws.send('Hello'); // May be binary }; ws.onmessage = function(e) { console.log(e.data); // May be binary };
HttpHandler WebSocketHandler WebSocketConnection 1..*
GET /eventsource HTTP/1.1 Accept: text/eventstream HTTP/1.1 200 OK Content-Type: text/eventstream data: This is a message data: This is a message data: that spans multiple lines
var es = new EventSource('/some/path'); es.onmessage = function(e) { console.log(e.data); }; es.onopen = function(e) {}; es.onerror = function(e) {};
public class MyEventSourceHandler implements EventSourceHandler { public void onOpen(EventSourceConnection connection) { EventSourceMessage hi = new EventSourceMessage("Hello\nWorld"); connection.send(hi); } public void onClose(EventSourceConnection connection) { } }
GET /eventsource HTTP/1.1 Accept: text/eventstream HTTP/1.1 200 OK Content-Type: text/eventstream event: english data: December 6, 2011 2:08:12 PM EST event: french data: 6 décembre 2011 14:08:12 EST
Time-consuming or blocking
to another thread.
public class SlowHttpHandler implements HttpHandler { private final Executor slow = Executors.newCachedThreadPool(); public void handleHttpRequest(HttpRequest req, final HttpResponse res, final HttpControl ctl) { final String result = slowOperation(); res.content(result).end(); } private String slowOperation() { try { Thread.sleep(2000); return "Here you go"; } catch (InterruptedException e) { Thread.currentThread().interrupt(); return "ERROR"; } } }
public class SlowHttpHandler implements HttpHandler { private final Executor slow = Executors.newCachedThreadPool(); public void handleHttpRequest(HttpRequest req, final HttpResponse res, final HttpControl ctl) { slow.execute(new Runnable() { public void run() { final String result = slowOperation(); ctl.execute(new Runnable() { public void run() { res.content(result).end(); } }); } }); } private String slowOperation() { try { Thread.sleep(2000); return "Here you go"; } catch (InterruptedException e) { Thread.currentThread().interrupt(); return "ERROR"; } } }
App
Webbit
Web Server
App