golang jsonrpc

来源:互联网 发布:js调用dll 编辑:程序博客网 时间:2024/05/16 15:39

//手动抄写一遍,

package mainimport ("fmt""log""net""net/rpc""net/rpc/jsonrpc")type RpcObj struct {Id   int    `json:"id"` // struct标签, 如果指定,jsonrpc包会在序列化json时,将该聚合字段命名为指定的字符串Name string `json:"name"`}// 需要传输的对象type ReplyObj struct {Ok  bool   `json:"ok"`Id  int    `json:"id"`Msg string `json:"msg"`}type ServerHandler struct{}func (serverHandler ServerHandler) GetName(id int, returnObj *RpcObj) error {log.Println("server\t-", "recive GetName call, id:", id)returnObj.Id = idreturnObj.Name = "名称1"return nil}func (serverHandler ServerHandler) SaveName(rpcObj RpcObj, returnObj *ReplyObj) error {log.Println("server\t-", "recive SaveName call, RpcObj:", rpcObj)returnObj.Ok = truereturnObj.Id = rpcObj.IdreturnObj.Msg = "存储成功"return nil}func main() {server := rpc.NewServer()listener, err := net.Listen("tcp", ":8888")if err != nil {log.Fatal("server\t-", "listen error:", err.Error())}defer listener.Close()log.Println("server\t-", "start listion on port 8888")// 新建处理器serverHandler := &ServerHandler{}// 注册处理器server.Register(serverHandler)// 等待并处理链接go func() {for {conn, err := listener.Accept()if err != nil {log.Fatal(err.Error())}// 在goroutine中处理请求// 绑定rpc的编码器,使用http connection新建一个jsonrpc编码器,并将该编码器绑定给http处理器go server.ServeCodec(jsonrpc.NewServerCodec(conn))}}()//clientclient, err := net.DialTimeout("tcp", "localhost:8888", 1000*1000*1000*30) // 30秒超时时间if err != nil {log.Fatal("client\t-", err.Error())}defer client.Close()clientRpc := jsonrpc.NewClient(client)var rpcObj RpcObj// 请求数据,rpcObj对象会被填充clientRpc.Call("ServerHandler.GetName", 1, &rpcObj)// 远程返回的对象var reply ReplyObj// 传给远程服务器的对象参数saveObj := RpcObj{2, "对象2"}// 请求数据clientRpc.Call("ServerHandler.SaveName", saveObj, &reply)fmt.Println(reply.Msg)// Asynchronous calldivCall := clientRpc.Go("ServerHandler.SaveName", saveObj, &reply, nil)replyCall := <-divCall.Done // will be equal to divCallfmt.Println(replyCall.Reply)}


0 0
原创粉丝点击