【问题标题】:How to Manage Multiple Connections?如何管理多个连接?
【发布时间】:2012-06-05 18:20:45
【问题描述】:

我组装了一个简单的套接字服务器(见下文)。目前,它无法处理多个/并发请求。如何使套接字服务器更高效——即能够处理并发请求?我可以利用任何 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))))

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我直接使用 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 除了 aleph 文档之外,您还需要参考 lamina 文档。

    【讨论】:

    猜你喜欢
    • 2011-11-06
    • 2019-04-24
    • 2023-03-28
    • 2010-09-24
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2015-03-01
    相关资源
    最近更新 更多