2012-06-05 43 views
4

我把一个简单的套接字服务器放在一起(见下文)。目前,它无法处理多个/并发请求。如何使套接字服务器更高效 - 即能够处理并发请求?有没有我可以利用的clojure结构?到目前为止,我已经想过使用Java的NIO(而不是IO)或netty(如指出here)。如何管理多个连接?

(ns server.policy 
    (:import 
     (java.net ServerSocket SocketException) 
     java.io.PrintWriter)) 

    (defn create-socket 
     "Creates a socket on given port." 
     [port] 
     (ServerSocket. port)) 

    (defn get-writer 
     "Create a socket file writer." 
     [client] 
     (PrintWriter. (.getOutputStream client))) 

    (defn listen-and-respond 
     "Accepts connection and 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 is a 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)))) 

回答

2

我已经直接使用Netty成功了。但是,如果您想要更像是惯用的Clojure代码,请查看aleph库。它使用了Netty内部,但会导致更简单的代码:

(use 'lamina.core 'aleph.tcp) 

(defn echo-handler [channel client-info] 
    (siphon channel channel)) 

(start-tcp-server echo-handler {:port 1234}) 

而且,记住,你sometimes需要引用lamina文档中除了ALEPH文档。

+0

感谢您对'aleph'图书馆的提醒。我一定会尝试它 - 我想直接尝试netty,但这不是很顺利 - > http://stackoverflow.com/questions/10918300/java-interop-netty-clojure – Ari