(ns sockets.connection
(:import java.nio.channels.ServerSocketChannel)
(:import java.nio.channels.Selector)
(:import java.nio.channels.SelectionKey)
(:import java.net.InetSocketAddress)
(:import java.io.PrintWriter))
(defn- make-nio-server-socket
"Creates server socket"
[]
(ServerSocketChannel/open))
(defn make-nonblocking-nio-server-socket
"Creates a non blocking socket"
[]
(let [socket-channel (make-nio-server-socket)]
(.configureBlocking socket-channel false)
socket-channel))
(defn connect-socket!
"connects the given socket to the host and port"
[socket-channel host port]
(.bind (.socket socket-channel) (InetSocketAddress. host port))
socket-channel)
(defn close-socket!
"disconnects the given socket"
[socket-channel]
(.close socket-channel))
(defn handle-connection
"output msg to connection"
[key]
(let [socket (.. key channel accept socket)
out (PrintWriter. (.getOutputStream socket) true)]
(.println out "k, thx, bye")
(.close out)))
(defn recv
"receives the given events for the socket"
[socket-channel key-type]
(let [selector (Selector/open)]
(println "registering")
(.register socket-channel selector key-type)
(println "selecting")
(loop [event-count (.select selector)
event-keys (.selectedKeys selector)]
(println (str "event count: " event-count))
(println (str "length of key set: " (.size event-keys)))
(doall (map println event-keys))
(doall (map #(handle-connection %) event-keys))
(println (str "length of key set: " (.size event-keys)))
(recur (.select selector) (.. selector selectedKeys) ))))(ns sockets.connection
(:import java.nio.channels.ServerSocketChannel)
(:import java.nio.channels.Selector)
(:import java.nio.channels.SelectionKey)
(:import java.net.InetSocketAddress)
(:import java.io.PrintWriter))
(defn- make-nio-server-socket
"Creates server socket"
[]
(ServerSocketChannel/open))
(defn make-nonblocking-nio-server-socket
"Creates a non blocking socket"
[]
(let [socket-channel (make-nio-server-socket)]
(.configureBlocking socket-channel false)
socket-channel))
(defn connect-socket!
"connects the given socket to the host and port"
[socket-channel host port]
(.bind (.socket socket-channel) (InetSocketAddress. host port))
socket-channel)
(defn close-socket!
"disconnects the given socket"
[socket-channel]
(.close socket-channel))
(defn handle-connection
"output msg to connection"
[key]
(let [socket (.. key channel accept socket)
out (PrintWriter. (.getOutputStream socket) true)]
(.println out "k, thx, bye")
(.close out)))
(defn recv
"receives the given events for the socket"
[socket-channel key-type]
(let [selector (Selector/open)]
(println "registering")
(.register socket-channel selector key-type)
(println "selecting")
(loop [event-count (.select selector)
event-keys (.selectedKeys selector)]
(println (str "event count: " event-count))
(println (str "length of key set: " (.size event-keys)))
(doall (map println event-keys))
(doall (map #(handle-connection %) event-keys))
(println (str "length of key set: " (.size event-keys)))
(recur (.select selector) (.. selector selectedKeys) ))))