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

また、アレフのドキュメントに加えてラミナのドキュメントを参照する必要がある場合があることに注意してください。

于 2012-06-05T21:28:25.827 に答える