server.clj

Branches > main > 62d54a1 > 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]
   [net.bowmap.network.handle :as handle]
   [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-agent (client/client socket)]
        (io-thread
          (try
            (loop []
              (let [frame (streams/read-frame!! input-stream)]
                (send client-agent handle/process-serverbound-frame frame))
              (recur))
            (catch EOFException _)
            (catch SocketException _)
            (finally
              (Socket/.close socket)))))
      (recur))))