server.clj
Branches > main > ebd8059 > files / src / net / bowmap / transport / server.clj
(ns net.bowmap.transport.server
(:require
[clojure.core.async :refer [io-thread]]
[net.bowmap.transport.connection :as connection])
(:import
[java.net ServerSocket SocketException]))
(defonce server (atom nil))
(defn accept-connection!! [server-socket]
(connection/connection (ServerSocket/.accept server-socket)))
(defn start-server!
"Starts a Minecraft server at the specified port.
Subsequent calls to this function will close and replace the old server.
Connected clients will be passed to 'handler'."
[port handler]
(when-let [server @server]
(ServerSocket/.close server))
(let [server-socket (ServerSocket. port)]
(reset! server server-socket)
(try
(loop []
(let [connection (accept-connection!! server-socket)]
(io-thread (handler connection)))
(recur))
(catch SocketException _))))