Clojure中的Socket编程

3

我是一名Clojure新手,请见谅。我正尝试编写一个简单的程序来通过套接字发送命令并得到响应。我的代码如下:

(def IPaddress "10.71.18.81")
(def port 1500)

(def socket (new Socket IPaddress port))
(print (clojure.string/join ["\nConnected to HSM: " (. socket isConnected)]))
(def in (DataInputStream. (BufferedInputStream. (. socket getInputStream))))
(def out (DataOutputStream. (BufferedOutputStream. (. socket getOutputStream))))
(def command "Some string")
(. out WriteUTF command)
(def response (. in readUTF))
(print (clojure.string/join ["Output from HSM: " response]))

错误信息是“Exception in thread "main" java.lang.IllegalArgumentException: No matching method: writeUTF”。我在理解Java互操作性和访问对象方法等方面遇到了困难。提前致谢。
编辑:如果有人感兴趣,我的最终可工作代码包含在此处:
(def IPaddress "10.71.18.81")
(def port 1500)

(def socket (Socket. IPaddress port))
(println "Connected:" (.isConnected socket))
(def in (DataInputStream. (BufferedInputStream. (.getInputStream socket))))
(def out (DataOutputStream. (BufferedOutputStream. (.getOutputStream socket))))
(def command "Some string")
(println "Input:" command)
(.writeUTF out command)
(.flush out)
(def response (.readUTF in))
(println "Output: " response)

我已经编辑过了,让它更符合 Clojure 的惯用语。 - DanLebrero
2个回答

3

我知道这篇文章比较旧,但这是我找到的在Clojure中读写Socket的唯一示例之一。为了让你的代码能够正常运行,我进行了一些尝试,希望下面的结果对其他人有所帮助:

(import (java.net Socket))
(import (java.io DataInputStream DataOutputStream))

(def IPaddress "127.0.0.1")
(def port 1500)
(def command "Some string\n")
(def socket (Socket. IPaddress port))

(def in (DataInputStream. (.getInputStream socket)))
(def out (DataOutputStream. (.getOutputStream socket)))

(println "Input:" command)
(.writeUTF out command)

(def response (.readLine in))
(println "Output: " response)

2

Java是大小写敏感的,因此应该使用(. out writeUTF command)。请注意,交互操作的首选语法是(.writeUTF out command),它与您的语句等效。


非常感谢。还有一些其他小错误已经被修复了。 - Conor Leonard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接