minecraft_server.clj
Branches > main > aa17513 > files / src / net / bowmap / network / minecraft_server.clj
(ns net.bowmap.network.minecraft-server
(:require
[clojure.core.async :refer [>!! chan close! io-thread]]
[net.bowmap.network.connection :as connection])
(:import
[java.io EOFException]
[java.net ServerSocket SocketException]))
(defonce server (atom nil))
(defn accept-connection!! [server-socket]
(connection/connection (ServerSocket/.accept server-socket)))
; TODO document
(defn start-server! [port]
(when-let [server @server]
(ServerSocket/.close server))
(let [connections (chan 64)
server-socket (ServerSocket. port)]
(reset! server server-socket)
(io-thread
(loop []
; TODO close the channel when the server closes
(let [connection (accept-connection!! server-socket)
{:keys! [::connection/serverbound-frames]} connection]
(io-thread
(try
(loop []
(>!! serverbound-frames (connection/read-frame!! connection))
(recur))
(catch EOFException _)
(catch SocketException _)
(finally
(close! serverbound-frames))))
(>!! connections connection))
(recur)))
connections))