golang jsonrpc 调用 java json rpc

Posted

技术标签:

【中文标题】golang jsonrpc 调用 java json rpc【英文标题】:golang jsonrpc call java json rpc 【发布时间】:2015-08-21 15:23:34 【问题描述】:

我试图通过 json rpc 将 golang 程序与 java 程序连接起来,但遇到了一些麻烦。我使用 golang 原生包中的“net/rpc/jsonrpc”包,以及 java 中的“jsonrpc4j”。我使用流模式在java中创建服务器,因为golang的jsonrpc只支持tcp调用。但它仍然在golang客户端得到错误响应:

err: 错误映射无效[code:-32602 message:Invalid method parameters]

同时java服务器也遇到错误:

com.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容 在 [来源:com.googlecode.jsonrpc4j.NoCloseInputStream@385b5b5c;行:1,列:1] 在 com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) 在 com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3747) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3687) 在 com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2202) 在 com.googlecode.jsonrpc4j.JsonRpcServer.handle(JsonRpcServer.java:224) 在 com.googlecode.jsonrpc4j.StreamServer$Server.run(StreamServer.java:214) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:744)

我不明白为什么它不起作用,jsonrpc协议中是否存在任何golang无法调用java的规则或者我只是没有做对?

【问题讨论】:

我之前尝试过类似的事情,但遇到了死胡同。据我所知,Go rpc 包仅支持 Go 服务器和客户端,不支持其他语言编写的。这是 Golang-Nuts 谷歌组的一个参考:groups.google.com/forum/#!topic/golang-nuts/F0cuNKsH7c4 【参考方案1】:

我希望我有一个更好的答案。这是我试图早点完成但无法实现的事情。我读过只有 Go 客户端可以 rpc 到 Go 服务器。

在尝试让 json/rpc 在 Java 和 Go 之间工作后,我采用了两种方法,也许你可以根据自己的需要定制一些类似的东西。

在一个案例中,我使用了 net/http 包并在 Go 中做了一个基本的 Web 服务器,然后使用 HandlerFunc 来根据 url 请求调用函数/方法。这些请求基于简单的 http 表单操作。然后我重定向回主页,因为我希望“应用程序”留在用户面前,因为我只需要“/submit” url 来触发一个带有从表单传入的值的方法。

不是那么优雅,但它可以在紧要关头快速建立一种收集信息的方式,并且可以通过让我的同事知道我正在监听的端口来立即“部署”。

在第二种情况下,因为我的一个朋友正在编写 Java 端,所以我设置了一个套接字,列出了我们同意的字节模式,它将调用特定的函数。

适应性不太强,但如果你从客户那里得到什么,那效果很好。

【讨论】:

感谢您的回答。你以一种非常聪明的方式解决了问题。但我终于解决了。有3个关键点。首先,golang 的 json-rpc 已经遵守了它的 rpc 的规则,这个函数应该只有一个收益 pramater。其次,java json-rpc中注册的方法名不像golang,只是方法名,不包括类名。第三,保持程序在套接字中通信,而不是 Http。 Here is my demo code if you are intrested,不好意思写成中文,你看代码就行了。

以上是关于golang jsonrpc 调用 java json rpc的主要内容,如果未能解决你的问题,请参考以下文章

golang http+jsonrpc 从网页访问

golang下的rpc框架jsonrpc理解和使用示例

golang下的rpc框架jsonrpc理解和使用示例

使用 Chart.js 绘制图表,其中填充了每个 JsonRPC 获取的数据

Jsonrpc4j 和 go 的 rpc/jsonrpc 之间的 JSONRPC 格式不同

jsonrpc.js -- 原生js实现 JSON-RPC 协议