server.clj

Branches > main > ea20cfa > 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 _))))