【问题标题】:Transmitting commands from a client to a server in Clojure/Java在 Clojure/Java 中将命令从客户端传输到服务器
【发布时间】:2010-06-26 14:47:28
【问题描述】:

我正在开发 Clojure 应用程序,其中客户端需要向服务器发送一些命令。这些将大量发生,因此我希望它在处理和在线序列化大小方面都相当有效。

在 Clojure 中执行此操作的最佳方法是什么?

目前我正在考虑:

  • 创建简单的标准表示,例如{:command-id 1, :params [1 2 3 "abc"]}
  • 使用一些高效的 Java 库(例如 Kryo)进行序列化,并对其进行配置以理解 Clojure 数据类型
  • 使用 Java NIO 库将适当的客户端/服务器套接字实现组合在一起,以通过 TCP/IP 进行传输

但这似乎有点令人费解,我相信其他人已经想出了更聪明的方法。非常感谢任何想法/建议!

【问题讨论】:

    标签: java serialization clojure client-server nio


    【解决方案1】:

    如果参数不是太大并且来源是可信的,为什么不将 s-expressions 发送回来和 fort,

    (eval (read-string "(println \"Hello World\")"))
    

    Clojure 作为 LISP 方言代码就是数据。

    编辑:

    为了安全起见,在读取字符串后,您会根据一组有效的命令检查命令,

    (contains? #{'println} 
               (first (read-string "(println \"Hello World\")")))
    

    或者您可以使用为此设计的库,例如

    http://github.com/Licenser/clj-sandbox

    【讨论】:

    • 有趣的想法!对于客户端可能会受到威胁但如果您能弄清楚如何将输入限制为已知安全命令的互联网渠道可能会有点风险
    • 对于手动解决方案,请记住将*read-eval* 重新绑定到false!尽管为此手动滚动解决方案可能是个坏主意; clj-sandbox 可能会更强大更高效(如果您知道如何改进它,那么您将通过分享您的想法为 Clojure 社区提供一项很棒的服务!)。
    • 好吧,如果你过滤掉所有的函数调用,只留下数据,你就会得到一个 Clojure 版本的 JSON。克隆?主要区别可能是对关键字、比率和正则表达式的支持。
    • 谢谢大家!看起来是最合适的解决方案。我将进一步探索如何处理安全问题:-)
    【解决方案2】:

    Google 的协议缓冲区怎么样? Clojure 中有一个用于处理它们的库:clojure-protobuf。我记得 Freenode #clojure 上的某个人正在对一项严肃的任务(处理大量 Twitter 数据)进行 Haskell 与 OCaml 与 Clojure 的比较;他/她一直对 lib 赞不绝口。

    更新:Here 是我想到的#clojure 对话中的相关话语。

    【讨论】:

    • 是的,我不久前看过协议缓冲区,当时我似乎记得它看起来非常好,虽然我更喜欢 Kryo,因为它更动态一些(你可以以编程方式定义你的序列化格式而不是在固定的外部 .proto 文件中指定它)
    【解决方案3】:

    我的答案不是 Clojure 特定的,但我更喜欢字符串而不是 http - 它相当标准且相当有效。

    几乎每种语言都有 JSON 库,除非数据量很大,否则我会使用它(以及您的简单标准命令格式)。

    我的经验是,您越不需要摆弄专门的格式、套接字和协议,您就越有可能在海滩度过周末 :)。

    我会保留比 HTTP 上的 JSON 更复杂的东西,直到基准测试显示需要其他东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多