Skip to content

Instantly share code, notes, and snippets.

@aamedina
Created June 18, 2014 01:19
Show Gist options
  • Select an option

  • Save aamedina/2528434fec26eac9e1dc to your computer and use it in GitHub Desktop.

Select an option

Save aamedina/2528434fec26eac9e1dc to your computer and use it in GitHub Desktop.
(defn server-response
[^DatagramPacket packet]
(let [ret (packet-content packet)]
(Unpooled/copiedBuffer ret CharsetUtil/UTF_8)) )
(defn server-handler []
(proxy [SimpleChannelInboundHandler] []
(messageReceived [^ChannelHandlerContext ctx ^DatagramPacket packet]
(let [content (packet-content packet)
res (DatagramPacket. (server-response packet) (.sender packet))]
(.write ctx res)))
(channelReadComplete [^ChannelHandlerContext ctx]
(.flush ctx))
(exceptionCaught [^ChannelHandlerContext ctx ^Throwable cause]
(.printStackTrace cause))))
(defrecord UDPSocketServer [bootstrap group port]
c/Lifecycle
(start [this]
(let [channel (.channel (.bind bootstrap port))
close-future (.closeFuture channel)]
(.addListener close-future (reify GenericFutureListener
(operationComplete [_ future]
(c/stop this))))
this))
(stop [this]
(.shutdownGracefully group)
this))
(defn udp-socket-server
[port]
(let [group (NioEventLoopGroup.)
bootstrap (doto (Bootstrap.)
(.group group)
(.channel NioDatagramChannel)
(.option ChannelOption/SO_BROADCAST true)
(.handler (server-handler)))]
(UDPSocketServer. bootstrap group (int port))))
(def server (udp-socket-server 3000))
(defn start
[]
(alter-var-root #'server c/start))
(defn stop
[]
(alter-var-root #'server c/stop))
(defn reset
[]
(alter-var-root #'server c/stop)
(refresh-all :after start))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment