在 JSON-RPC 方法中获取 websocket 连接信息
Posted
技术标签:
【中文标题】在 JSON-RPC 方法中获取 websocket 连接信息【英文标题】:Getting websocket connection information in JSON-RPC method 【发布时间】:2015-04-14 19:02:54 【问题描述】:我在 Websocket 上使用 JSON-RPC。而且,在 RPC 方法中(例如,下面示例中的乘法),我需要知道哪个连接调用了该方法。下面的部分显示“// 此处需要 Websocket 连接信息”。我该怎么做?
package main
import (
"code.google.com/p/go.net/websocket"
"net/http"
"net/rpc"
"net/rpc/jsonrpc"
)
type Args struct
A int
B int
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error
*reply = args.A * args.B
// Need Websocket connection information here
return nil
func main()
rpc.Register(new(Arith))
http.Handle("/conn", websocket.Handler(serve))
http.ListenAndServe("localhost:7000", nil)
func serve(ws *websocket.Conn)
jsonrpc.ServeConn(ws)
【问题讨论】:
【参考方案1】:这将具有挑战性,因为它违反了 RPC 提供的抽象。这是一个策略建议:
Google 的许多 API 都使用上下文对象:https://blog.golang.org/context。该接口的一部分是任意数据的 Value 方法:
Value(key interface) interface
这将为您提供类似于线程本地存储的东西,这在其他编程语言中通常用于此目的。
那么如何在请求中添加上下文对象呢?一种方法是创建一个新的自定义ServerCodec
:
type ServerCodec interface
ReadRequestHeader(*Request) error
ReadRequestBody(interface) error
// WriteResponse must be safe for concurrent use by multiple goroutines.
WriteResponse(*Response, interface) error
Close() error
你的实现大部分可以反映jsonrpc
的:
var params [1]interface
params[0] = x
return json.Unmarshal(*c.req.Params, ¶ms)
但在返回之前,您可以使用一点反射,并在params
中查找名称/类型为Context
的字段,然后填充它。比如:
ctx := createContextSomehow()
v := reflect.ValueOf(x)
if v.Kind() == reflect.Ptr
v = v.Elem()
if v.Kind() == reflect.Struct
ctxv := v.FieldByName("Context")
ctxv.Set(ctx)
然后更改您的请求:
type Args struct
A int
B int
改成:
type Args struct
A int
B int
Context context.Context
有点笨拙,但我认为你可以做到这一点。
【讨论】:
以上是关于在 JSON-RPC 方法中获取 websocket 连接信息的主要内容,如果未能解决你的问题,请参考以下文章
如何从 json-rpc webservice 获取数据:iPad /iPhone / Objective C
使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?
如何通过 Phantom 钱包集成使用 Vanilla JS 和 JSON-RPC 获取 Solana 帐户信息和/或 SOL 余额?