Created
April 14, 2011 14:21
-
-
Save casualjim/919560 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.concurrent.atomic.AtomicReference | |
import java.util.concurrent.{TimeUnit, Executors} | |
import java.util.Date | |
import javax.servlet.http.{HttpServletRequest, HttpServletResponse, HttpServlet} | |
import javax.servlet.{ServletContext, ServletConfig} | |
import org.glassfish.grizzly.comet._ | |
import org.glassfish.grizzly.http.HttpRequestPacket | |
import collection.JavaConversions._ | |
import org.glassfish.grizzly.http.server.{Response, HttpServer} | |
import org.glassfish.grizzly.servlet.ServletHandler | |
import org.glassfish.grizzly.websockets._ | |
import org.glassfish.grizzly.websockets.frame.Frame | |
object Main { | |
val timer = Executors.newSingleThreadScheduledExecutor | |
class TimedWebSocketApplication extends WebSocketApplication[WebSocket] { | |
def onMessage(p1: WebSocket, p2: Frame) { | |
println("message received") | |
timer.scheduleAtFixedRate(new Runnable { | |
def run() { | |
println("sending time") | |
p1.send(Frame.createTextFrame("the time: " + (new Date).toString)) | |
} | |
}, 500, 500, TimeUnit.MILLISECONDS) | |
} | |
} | |
class EchoWebSocketApplication extends WebSocketApplication[WebSocket] { | |
def isApplicationRequest(request: HttpRequestPacket) = { | |
"/echo".equals(request.getRequestURI) | |
} | |
def onMessage(p1: WebSocket, p2: Frame) { | |
p1.send(Frame.createTextFrame("ECHO: " + p2.getAsText)) | |
} | |
} | |
class TimeCometHandler(httpResponse: HttpServletResponse) extends CometHandler[String] { | |
private var _context: CometContext[String] = _ | |
private var _response: Response = _ | |
def onInterrupt(p1: CometEvent[_]) { | |
println("client disconnect?, interrupt, event type: " + p1.getType) | |
} | |
def onTerminate(p1: CometEvent[_]) { | |
println("terminating, event type: " + p1.getType) | |
} | |
def onInitialize(p1: CometEvent[_]) { | |
println("initializing") | |
} | |
def onEvent(p1: CometEvent[_]) { | |
println("handling event: " + p1.getType) | |
if (CometEvent.Type.NOTIFY == p1.getType) { | |
val w = httpResponse.getWriter | |
w.println(p1.attachment.toString) | |
w.flush() | |
} | |
} | |
def setCometContext(p1: CometContext[String]) { | |
println("setting comet context") | |
_context = p1 | |
} | |
def getCometContext = _context | |
def setResponse(p1: Response) { | |
println("setting response") | |
_response = p1 | |
} | |
def getResponse = _response | |
} | |
class TimeCometServlet extends HttpServlet { | |
var contextPath: String = _ | |
override def init(config: ServletConfig) { | |
val context: ServletContext = config.getServletContext | |
contextPath = context.getContextPath | |
val engine: CometEngine = CometEngine.getEngine | |
val cometContext: CometContext[_] = engine.register(contextPath) | |
cometContext.setExpirationDelay(5 * 30 * 1000) | |
} | |
override def doGet(req: HttpServletRequest, resp: HttpServletResponse) { | |
println("Entering timed_comet") | |
val handler = new TimeCometHandler(resp) | |
timer.scheduleAtFixedRate(new Runnable { | |
def run() { | |
val engine = CometEngine.getEngine | |
val context = engine.getCometContext[String](contextPath) | |
context.notify("The current time: " + (new Date).toString) | |
} | |
}, 500, 500, TimeUnit.MILLISECONDS) | |
val engin = CometEngine.getEngine | |
val cont = engin.getCometContext[String](contextPath) | |
cont.addCometHandler(handler) | |
cont.notify("connected") | |
val w = resp.getWriter | |
w.write("success") | |
w.flush | |
} | |
} | |
def main(args: Array[String]) { | |
println("this works already.") | |
val server = HttpServer.createSimpleServer("src/main/webapp", 8888) | |
server.getServerConfiguration.setHttpServerName("Backchat WebSocket Server") | |
server.getServerConfiguration.setName("Backchat WebSocket Server") | |
server.getListeners foreach { l => | |
l.registerAddOn(new WebSocketAddOn) | |
l.registerAddOn(new CometAddOn) | |
} | |
server.getServerConfiguration.addHttpHandler(new ServletHandler(new TimeCometServlet), "/timed_comet") | |
// WebSocketEngine.getEngine.registerApplication("/echo", new EchoWebSocketApplication) | |
WebSocketEngine.getEngine.registerApplication("/timer", new TimedWebSocketApplication) | |
try { | |
server.start(); | |
println("Press any key to stop the server..."); | |
System.in.read(); | |
} finally { | |
// stop the server | |
timer.shutdownNow | |
server.stop(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment