From 297a818066b168e6ad85d350ccbf37b655d8e988 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Fri, 27 Jan 2012 13:11:38 -0600 Subject: [PATCH] Working Clojure Netty client code. --- other/project.clj | 3 +- other/websockify.clj | 69 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/other/project.clj b/other/project.clj index 8874ec1..7942853 100644 --- a/other/project.clj +++ b/other/project.clj @@ -5,8 +5,7 @@ [org.eclipse.jetty/jetty-websocket "7.5.4.v20111024"] [org.eclipse.jetty/jetty-server "7.5.4.v20111024"] [org.eclipse.jetty/jetty-servlet "7.5.4.v20111024"] - ;[commons-codec/commons-codec "1.4"] - ;[clj-base64 "0.0.0-SNAPSHOT"] + [org.jboss.netty/netty "3.2.5.Final"] ] ; :dev-dependencies [[swank-clojure "1.3.0-SNAPSHOT"]] ) diff --git a/other/websockify.clj b/other/websockify.clj index d8cfee7..fb22f5a 100644 --- a/other/websockify.clj +++ b/other/websockify.clj @@ -2,7 +2,20 @@ (:use ring.adapter.jetty) ;(:import [org.jboss.netty.handler.codec.base64 Base64]) - (:import [java.net URL URI] + + (:import + ;[java.io BufferedReader DataOutputStream] + + [java.net InetSocketAddress] + [java.nio ByteBuffer] + [java.nio.channels SocketChannel] + + [org.jboss.netty.channel + Channels SimpleChannelHandler ChannelPipelineFactory] + [org.jboss.netty.channel.socket.nio NioClientSocketChannelFactory] + [org.jboss.netty.bootstrap ClientBootstrap] + [java.util.concurrent Executors] + [org.eclipse.jetty.server Server] [org.eclipse.jetty.server.nio BlockingChannelConnector] [org.eclipse.jetty.servlet ServletContextHandler ServletHolder DefaultServlet] @@ -12,22 +25,68 @@ (defonce settings (atom {})) +;; TCP / NIO + +;; (defn tcp-channel [host port] +;; (try +;; (let [address (InetSocketAddress. host port) +;; channel (doto (SocketChannel/open) +;; (.connect address))] +;; channel) +;; (catch Exception e +;; (println (str "Failed to connect to'" host ":" port "':" e)) +;; nil))) + +;; http://docs.jboss.org/netty/3.2/guide/html/start.html#d0e51 +(defn make-netty-client-handler [] + (proxy [SimpleChannelHandler] [] + (channelConnected [ctx e] + (println "channelConnected:" e)) + (channelDisconnected [ctx e] + (println "channelDisconnected:" e)) + (messageReceived [ctx e] + (println "messageReceived:" (.getMessage e))) + (exceptionCaught [ctx e] + (println "exceptionCaught:" e)))) + +(defn netty-client [host port] + (let [pipeline (proxy [ChannelPipelineFactory] [] + (getPipeline [] + (doto (Channels/pipeline) + (.addLast "handler" (make-netty-client-handler))))) + bootstrap (doto (ClientBootstrap. + (NioClientSocketChannelFactory. + (Executors/newCachedThreadPool) + (Executors/newCachedThreadPool))) + (.setPipelineFactory pipeline) + (.setOption "tcpNoDelay" true) + (.setOption "keepAlive" true)) + channel-future (.connect bootstrap (InetSocketAddress. host port)) + channel (.. channel-future (awaitUninterruptibly) (getChannel))] + channel)) + + + ;; WebSockets + + (defonce clients (atom {})) - +;; http://wiki.eclipse.org/Jetty/Feature/WebSockets (defn make-websocket-handler [] (reify org.eclipse.jetty.websocket.WebSocket$OnTextMessage (onOpen [this connection] (println "Got WebSocket connection:" connection) - (swap! clients assoc this connection)) + #_(let [target (tcp-channel "localhost" 5901)] + (swap! clients assoc this {:client connection + :target target}))) (onClose [this code message] (println "Got WebSocket close:" code message) (swap! clients dissoc this)) (onMessage [this data] (println "Got WebSocket message:" data)))) -(defn websocket-servlet [] +(defn make-websocket-servlet [] (proxy [org.eclipse.jetty.websocket.WebSocketServlet] [] (doGet [request response] ;(println "doGet" request) @@ -47,7 +106,7 @@ (let [http-servlet (doto (ServletHolder. (DefaultServlet.)) (.setInitParameter "dirAllowed" "true") (.setInitParameter "resourceBase" web)) - ws-servlet (ServletHolder. (websocket-servlet)) + ws-servlet (ServletHolder. (make-websocket-servlet)) context (doto (ServletContextHandler.) (.setContextPath "/") (.addServlet ws-servlet "/websocket"))