package jsonrpc

作者: Golang语言社区 | 来源:发表于2018-12-12 17:28 被阅读4次

    大家好,我是彬哥,社区论坛:www,Golang.Ltd;本节给大家讲解下标准库中jsonrpc的使用及注意点,如下:

    Go项目中如何导入:
    import "net/rpc/jsonrpc"

    标注库实现的接口:
    jsonrpc包实现了JSON-RPC的ClientCodec和ServerCodec接口,可用于rpc包。

    func Dial(network, address string) (*rpc.Client, error)
    func NewClient(conn io.ReadWriteCloser) rpc.Client
    func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
    func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
    func ServeConn(conn io.ReadWriteCloser)
    func Dial
    func Dial(network, address string) (
    rpc.Client, error)
    Dial在指定的网络和地址连接一个JSON-RPC服务端。

    func NewClient
    func NewClient(conn io.ReadWriteCloser) *rpc.Client
    NewClient返回一个新的rpc.Client,以管理对连接另一端的服务的请求。

    func NewClientCodec
    func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
    NewClientCodec返回一个在连接上使用JSON-RPC的rpc.ClientCodec。

    func NewServerCodec
    func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
    NewServerCodec返回一个在连接上使用JSON-RPC的rpc. ServerCodec。

    func ServeConn
    func ServeConn(conn io.ReadWriteCloser)
    ServeConn在单个连接上执行DefaultServer。ServeConn会阻塞,服务该连接直到客户端挂起。调用者一般应另开线程调用本函数:"go serveConn(conn)"。ServeConn在该连接使用JSON编解码格式。

    // -----------------------------------------------------------------------------
    client:
    // jsonrpc 数据处理

    import (
    _ "LollipopGo/LollipopGo/player"
    "Proto"
    "Proto/Proto2"
    "encoding/base64"
    "encoding/json"
    "fmt"
    "net/http"
    "net/rpc/jsonrpc"
    "strconv"
    )

    func main(){
    DB_rpc_()
    }

    func DB_rpc_() interface{} {
    // 链接DB操作
    client, err := jsonrpc.Dial("tcp", service)
    if err != nil {
    fmt.Println("dial error:", err)
    }
    // 测试 --
    args := Args{1, 2}
    // 返回数据的结构体 --> 消息的结构
    // 正常是读取数据库后得到的
    var reply Proto2.GL2C_GameLogin
    // 同步调用
    // err = client.Call("Arith.Muliply", args, &reply)
    // if err != nil {
    // fmt.Println("Arith.Muliply call error:", err)
    // }
    // 异步调用
    divCall := client.Go("Arith.Muliply", args, &reply, nil)
    replyCall := <-divCall.Done // will be equal to divCall
    fmt.Println(replyCall.Reply)
    // 返回的数据
    fmt.Println("the arith.mutiply is :", reply)
    return reply
    }
    // -----------------------------------------------------------------------------
    server:
    package main

    import (
    "LollipopGo/LollipopGo/player"
    "Proto/Proto2"
    "fmt"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
    "os"
    )

    // DB的数据的信息
    var (
    service = "127.0.0.1:8890"
    )

    func init() {
    arith := new(Arith)
    rpc.Register(arith)
    return
    }

    func checkError(err error) {
    if err != nil {
    fmt.Fprint(os.Stderr, "Usage: %s", err.Error())
    }
    }

    // 监听操作
    func MainListener(strport string) {
    arith := new(Arith)
    rpc.Register(arith)
    // 获取数据操作
    tcpAddr, err := net.ResolveTCPAddr("tcp", ":"+strport)
    checkError(err)
    Listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)

    for {
        conn, err := Listener.Accept()
        if err != nil {
            fmt.Fprint(os.Stderr, "accept err: %s", err.Error())
            continue
        }
        go jsonrpc.ServeConn(conn)
    }
    

    }
    type Args struct {
    A, B int
    }
    type Arith int
    func (t *Arith) Muliply(args *Args, reply Proto2.GL2C_GameLogin) error {
    //
    reply = args.A * args.B
    // 组装数据
    data := &player.GateWayList{
    ServerID: 1001,
    ServerName: "大厅服务器",
    ServerIPAndPort: "gateway.h.babaliuliu.com:8888",
    State: "空闲",
    OLPlayerNum: 1024,
    MaxPlayerNum: 5000,
    }
    // 返回数据
    *reply = Proto2.GL2C_GameLogin{
    Protocol: 1,
    Protocol2: 2,
    Tocken: "22222",
    PlayerST: nil,
    GateWayST: data,
    }

    return nil
    

    }
    // 注意点:
    ServeConn在单个连接上执行DefaultServer。ServeConn会阻塞,服务该连接直到客户端挂起。调用者一般应另开线程调用本函数:"go serveConn(conn)"。ServeConn在该连接使用JSON编解码格式。
    // -----------------------------------------------------------------------------


    Golang语言社区

    相关文章

      网友评论

        本文标题:package jsonrpc

        本文链接:https://www.haomeiwen.com/subject/styphqtx.html