在Clojure / Java中将命令从客户端传输到服务器

时间:2010-06-26 14:47:29

标签: java serialization clojure client-server nio

我正在使用Clojure应用程序,客户端需要向服务器发送一些命令。这些将在相当大的数量内发生,所以我希望它在处理和线上序列化尺寸方面都相当有效。

在Clojure中这样做的最佳方式是什么?

目前我在考虑:

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

编辑:

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

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我的答案不是Clojure特有的,但我更喜欢字符串而不是http - 它是合理的标准和合理有效的。

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

我的经验是,你需要摆弄专门的格式,插座和协议越少,你就越有可能在海滩度过周末:)。

在基准测试显示需要其他内容之前,我会保留比JSON更复杂的内容。