gpt4 book ai didi

clojure - 如何管理多个连接?

转载 作者:行者123 更新时间:2023-12-01 04:03:54 25 4
gpt4 key购买 nike

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

最佳答案

我直接使用 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 文档之外的文档。

关于clojure - 如何管理多个连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10902663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com