server.clj
Branches > facts > 73c8e36 > files / src / net / bowmap / network / server.clj
(ns net.bowmap.network.server
(:require
[clojure.core.async :refer [io-thread]]
[net.bowmap.network.client :as client :refer [leave!]]
[net.bowmap.network.handle :as handle]
[net.bowmap.network.packets.serverbound :refer [decode-packet!]]
[net.bowmap.network.state :as state]
[net.bowmap.network.streams :as streams])
(:import
[java.io EOFException]
[java.net ServerSocket Socket SocketException]))
(defn start-server! [port]
(let [server (ServerSocket. port)]
(loop []
(let [socket (ServerSocket/.accept server)
input-stream (Socket/.getInputStream socket)
client-ref (client/client socket)]
(io-thread
(try
(loop []
(let [frame (streams/read-frame!! input-stream)]
(dosync
(->> (decode-packet! frame (::state/connection-state @client-ref))
(handle/handle!! client-ref))))
(recur))
(catch EOFException _)
(catch SocketException _)
(finally
(leave! client-ref)))))
(recur))))