【问题标题】:custom accept function in start-server clojure启动服务器clojure中的自定义接受功能
【发布时间】:2022-09-13 14:19:46
【问题描述】:

我正在尝试运行clojure.core.server/start-server,但我不想使用 repl,而是想要一个自定义函数作为接受选项。我正在关注 this post,其中一个 repl 服务器被执行为

clojure -X clojure.core.server/start-server :name '"server"' :port 5555 :accept clojure.core.server/repl :server-daemon false

我需要什么要求才能传递一个函数来接受 opt?如果我只想打印来自任何连接的请求怎么办?使用clojure.core/println之类的东西不起作用

clojure -X clojure.core.server/start-server :name '"server"' :port 5555 :accept clojure.core/println :server-daemon false

顺便说一句,我什至无法在 repl 本身上运行 start-server,每次发出请求时我都会遇到错误。是否可以从 repl 运行它?

(clojure.core.server/start-server {:name "server" :port 9000 :accept clojure.core.server/repl :server-daemon false})
#object[java.net.ServerSocket 0x25b865b5 "ServerSocket[addr=localhost/127.0.0.1,localport=9000]"]
user=> Exception in thread "Clojure Connection server 1" java.lang.ClassCastException: class clojure.core.server$repl cannot be cast to class clojure.lang.Named (clojure.core.server$repl and clojure.lang.Named are in unnamed module of loader 'app')
        at clojure.core$namespace.invokeStatic(core.clj:1612)
        at clojure.core.server$accept_connection.invokeStatic(server.clj:73)
        at clojure.core.server$start_server$fn__8998$fn__8999$fn__9001.invoke(server.clj:117)
        at clojure.lang.AFn.run(AFn.java:22)
        at java.base/java.lang.Thread.run(Thread.java:833)

【问题讨论】:

    标签: clojure clojure-repl


    【解决方案1】:

    start-server 函数指出,:accept 必须是一个命名空间象征(所以这就是为什么你在 REPL 中看到错误的原因 (你正在传递一个多变的;使用'clojure.core/println代替—— 注意领先的')。

    至于传递你自己的功能,看看 函数clojure.core.server/accept-connection,到底发生了什么 上。所以基本上你的:accept函数被调用*in**out**err* 已重定向(以及 *session* 与某些内容的绑定 簿记)和:args。所以你想读/写 stdin/stdout 在你的函数中,并使用给定的参数进行参数化。

    例如。创建一个包含以下内容的文件src/so.clj

    (ns so)
    
    (defn accept
      [prefix]
      (loop []
        (println prefix (read-line))
        (recur)))
    

    然后从同一个根启动服务器:

    clojure -X clojure.core.server/start-server :name '"server"' :port 5555 
      :accept so/accept 
      :args '[">>>"]' 
      :server-daemon false
    

    注意 :accept 符号(它来自 shell,所以 Clojure 读取 那作为一个符号)指向命名空间和其中的函数。制作 当然,事情与类路径匹配(src 是默认源 Clojure CLI 的路径)。

    另请注意传递的 :args 表示为 EDN 数组。 在accept-connection 中,对您的函数的调用是(apply accept args),因此您可以在 accept-fn 中假设常规参数。

    然后用例如测试你的服务器telnet:

    % telnet localhost 5555
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    hello
    >>> hello
    world
    >>> world
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多