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

在Clojure/Java中将命令从客户端传输到服务器,java,serialization,clojure,client-server,nio,Java,Serialization,Clojure,Client Server,Nio,我正在开发Clojure应用程序,客户端需要向服务器发送一些命令。这些将发生在相当大的数量,所以我希望它是合理有效的,无论是在处理和有线串行大小 在Clojure这样做的最佳方式是什么 目前我在想: 创建一个简单的标准表示法,例如{:command id 1,:params[1 2 3“abc”]} 使用一些高效的Java库进行序列化,如,并将其配置为了解Clojure数据类型 使用JavaNIO库通过TCP/IP传输,拼凑出一个合适的客户机/服务器套接字实现 然而,这似乎有点复杂,我相信其

我正在开发Clojure应用程序,客户端需要向服务器发送一些命令。这些将发生在相当大的数量,所以我希望它是合理有效的,无论是在处理和有线串行大小

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

目前我在想:

  • 创建一个简单的标准表示法,例如{:command id 1,:params[1 2 3“abc”]}
  • 使用一些高效的Java库进行序列化,如,并将其配置为了解Clojure数据类型
  • 使用JavaNIO库通过TCP/IP传输,拼凑出一个合适的客户机/服务器套接字实现

然而,这似乎有点复杂,我相信其他人已经想出了更聪明的方法。非常感谢您的任何想法/建议

我的答案不是Clojure特有的,但我倾向于选择字符串而不是http——它相当标准,相当高效

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

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


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

谷歌的协议缓冲区如何?Clojure有一个用于处理这些问题的库:。我记得Freenode上有人#clojure正在做Haskell vs.OCaml vs.clojure的一项严肃任务比较(处理推特数据的负载);他/她一直在大肆赞扬自由党


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

如果参数不是太大,并且源是可信的,为什么不将s表达式发送回fort

(eval (read-string "(println \"Hello World\")"))
Clojure是一个LISP方言代码,是数据

编辑:

为了安全起见,在读取字符串后,请对照一组有效的命令检查命令

(contains? #{'println} 
           (first (read-string "(println \"Hello World\")")))
或者您可以使用为此设计的库,例如


是的,我不久前看过协议缓冲区,我似乎记得当时它看起来很不错,尽管我更喜欢Kryo,因为它更具动态性(您可以通过编程定义序列化格式,而不是在固定的外部.proto文件中指定),这是一个有趣的想法!对于通过internet的渠道,客户端可能会受到威胁,这可能有点风险,但如果您能够找出如何将输入限制为已知的安全命令,则可能工作得很好。对于手动解决方案,请记住将
*read eval*
重新绑定到
false
!尽管手动滚动解决方案可能是个坏主意;clj sandbox可能会更健壮、更高效(如果您知道如何改进它,那么通过分享您的想法,您将为Clojure社区提供一项出色的服务!)。好吧,如果您过滤掉所有函数调用,只留下数据,那么您将得到Clojure版本的JSON。克龙?主要的区别可能是对关键字、比率和regexp的支持。谢谢大家!看起来是最合适的解决方案。我将进一步探讨如何处理安全问题:-)