4

我组装了一个简单的套接字服务器(见下文)。目前,它无法处理多个/并发请求。如何使套接字服务器更高效——即能够处理并发请求?我可以利用任何 clojure 构造吗?到目前为止,我已经考虑过使用 java 的 NIO(而不是 IO)或 netty(如在此处指出的那样)。

(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))))
4

1 回答 1

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})

另外,请记住,除了 aleph 文档之外,有时您还需要参考lamina文档。

于 2012-06-05T21:28:25.827 回答