大家好,我是彬哥,社区论坛: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语言社区
网友评论