您的位置:首页 > 财经 > 产业 > 室内装修设计自学入门_企业为什么要培训_百度平台客服怎么联系_专业竞价托管哪家好

室内装修设计自学入门_企业为什么要培训_百度平台客服怎么联系_专业竞价托管哪家好

2025/4/18 10:00:13 来源:https://blog.csdn.net/qq_33446100/article/details/147194285  浏览:    关键词:室内装修设计自学入门_企业为什么要培训_百度平台客服怎么联系_专业竞价托管哪家好
室内装修设计自学入门_企业为什么要培训_百度平台客服怎么联系_专业竞价托管哪家好

说在前面

  • 操作系统:win11 wsl2
  • go-ethereum版本:1.15.8

关于json-rpc

  • 官网

server

  • 定义方法
    type CalculatorService struct{}func (s *CalculatorService) Add(a, b int) int {return a + b
    }func (s *CalculatorService) Div(a, b int) (int, error) {if b == 0 {return 0, errors.New("divide by zero")}return a / b, nil
    }
    
    这里我们简单定义两个方法
  • 启动服务
    func main() {calculator := new(CalculatorService)// 创建 RPC 服务器rpcServer := rpc.NewServer()// 注册服务if err := rpcServer.RegisterName("calculator", calculator); err != nil {panic(err)}// 启动 HTTP 服务器println("WebSocket server listening on :8080")httpHandler := rpcServer.WebsocketHandler([]string{"*"})http.Handle("/ws", httpHandler)http.ListenAndServe(":8080", nil)
    }
    

client

  • 调用
    在调用的时候,方法名需要指定为receiver_method,例如我们要调用CalculatorService.Add,那么调用名为calculator_add,注意,这里的calculator为server端注册时的RegisterName("calculator", calculator),而不是CalculatorService
    func main() {// 连接 WebSocket 服务端client, err := rpc.DialWebsocket(context.Background(), "ws://192.168.1.6:8080/ws", "")if err != nil {panic(err)}defer client.Close()// 调用远程方法var result interr = client.Call(&result, "calculator_add", 3, 5)if err != nil {panic(err)}fmt.Println("Result:", result) // 输出: Result: 8
    }
    
    假设将server端的RegisterName("calculator", calculator)改为RegisterName("calculate", calculator)
    panic: the method calculator_add does not exist/is not available
    

注意事项

返回值

  • server端的方法返回值只能有三种数量0,1,2
    • 0,即无返回值
    • 1,即自定义返回值或者一个error
    • 2,即自定义返回值+一个error
  • 这样,在client端调用的时候,err = client.Call(&result, "calculator_add", 3, 5)result对应自定义返回值,err对应返回的error
  • 例如,我们调用
    err = client.Call(&result, "calculate_div", 3, 0)
    if err != nil {panic(err)
    }
    
    得到的err即为server端Div方法返回的error
    panic: divide by zero
    

server端调用client端

  • 支持反向调用
  • 在我们定义server端方法的时候,可以增加一个context参数
    type CalculatorService struct{}func (s *CalculatorService) Add(ctx context.Context, a, b int) int {return a + b
    }func (s *CalculatorService) Div(ctx context.Context, a, b int) (int, error) {if b == 0 {return 0, errors.New("divide by zero")}return a / b, nil
    }
    
  • 这样我们就可以获取到client,进而调用其方法,例如,我们在client端添加一个方法
    type CalcService struct{}func (s *CalcService) GetParam(ctx context.Context) int {return 88
    }
    
    然后在client端注册
    func main() {// 连接 WebSocket 服务端client, err := rpc.DialWebsocket(context.Background(), "ws://192.168.1.6:8080/ws", "")if err != nil {panic(err)}defer client.Close()calculator := new(CalcService)client.RegisterName("calc", calculator)// 调用远程方法var result interr = client.Call(&result, "calculate_add", 3, 0)if err != nil {panic(err)}fmt.Println("Result:", result) // 输出: Result: 8
    }
    
    在server端的Add方法中,我们将b的值改为从client端获取
    func (s *CalcService) Add(ctx context.Context, a, b int) int {client, ok := rpc.ClientFromContext(ctx)if ok {client.Call(&b, "calc_getParam")}return a + b
    }
    
    这样运行后的结果为:
    Result: 91
    
  • 通过这种方式,我们可以在server端添加一个Register的方法,在client连接后,client主动调用Register方法,这样我们就可以管理所有client了

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com