socket.clj
Branches > main > e860102 > files / src / net / bowmap / server / network / socket.clj
(ns net.bowmap.server.network.socket
(:require
[clojure.core.async :refer [>!! chan close! io-thread]]
[net.bowmap.server.network.connection :as connection])
(:import
[java.net ServerSocket]))
(def max-server-backlog 50)
(defn server-socket
"Starts a server socket at the supplied port and optional bind address.
Returns a channel of connections that is coupled to the server's lifecycle."
[& {:keys! [port] :keys [bind-addr]}]
(let [server-socket (ServerSocket. port max-server-backlog bind-addr)
connection-chan (chan max-server-backlog)]
(io-thread
(try
(loop []
(when (>!! connection-chan (connection/connection (ServerSocket/.accept server-socket)))
(recur)))
(finally
(close! connection-chan)
(ServerSocket/.close server-socket))))
connection-chan))