server.clj

Branches > main > 7568602 > files / src / net / bowmap / transport / server.clj

(ns net.bowmap.transport.server
  (:require
   [clojure.core.async :refer [>!! chan close! 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.
   Returns a channel of connections that will close when the server does."
  [port]
  (when-let [server @server]
    (ServerSocket/.close server))
  (let [connections (chan 64)
        server-socket (ServerSocket. port)]
    (reset! server server-socket)
    (io-thread
      (try
        (loop []
          (>!! connections (accept-connection!! server-socket))
          (recur))
        (catch SocketException _)
        (finally
          (close! connections))))
    connections))