server.clj
Branches > main > 7bcccfb > files / src / net / bowmap / server / network / server.clj
(ns net.bowmap.server.network.server
(:require
[clojure.spec.alpha :as s]
[net.bowmap.server.network.connection :as connection])
(:import
[java.net ServerSocket]))
(defprotocol Server
(accept-connection!! [server]
"Accepts and returns a Connection from the server.
Blocks until the connection is ready.
Throws if a connection cannot be received from the server."))
(s/def ::server #(satisfies? Server %))
(defn start-server!
[& {:keys [port bind-addr backlog] :or {:backlog 50 :port 0}}]
(let [server-socket (ServerSocket. port backlog bind-addr)]
(reify Server
(accept-connection!! [_]
(try
(connection/connection (ServerSocket/.accept server-socket))
(catch Throwable t
(ServerSocket/.close server-socket)
(throw t)))))))