clojure - How to Manage Multiple Connections? -
i put simple socket server (see below). currently, not capable of handling multiple/concurrent requests. how can make socket server more efficient -- i.e. capable of handling concurrent requests? there clojure constructs can leverage? far, i've thought of using either java's nio (instead of io) or netty (as pointed out here).
(ns server.policy (:import (java.net serversocket socketexception) java.io.printwriter)) (defn create-socket "creates socket on given port." [port] (serversocket. port)) (defn get-writer "create socket file writer." [client] (printwriter. (.getoutputstream client))) (defn listen-and-respond "accepts connection , responds." [server-socket service] (let [client (.accept server-socket) socket-writer (get-writer client)] (service socket-writer))) (defn policy-provider "returns domain policy content." [socket-writer] (.print socket-writer "<content>this test</content>") (.flush socket-writer) (.close socket-writer)) (defn run-server [port] (let [server-socket (create-socket port)] (while (not (.isclosed server-socket)) (listen-and-respond server-socket policy-provider))))
i have had success using netty directly. however, if want feels little more idiomatic clojure code, take @ aleph library. uses netty internally, results in more simple code:
(use 'lamina.core 'aleph.tcp) (defn echo-handler [channel client-info] (siphon channel channel)) (start-tcp-server echo-handler {:port 1234}) also, keep in mind sometimes need reference lamina documentation in addition aleph documentation.
Comments
Post a Comment