package main
import (
"context"
"fmt"
"log"
"time"
"github.com/xmopen/gorpc/pkg/client"
"github.com/xmopen/gorpc/pkg/server"
)
func main() {
// test git add.1
go func() {
s := server.NewServer()
s.SetTrace(true)
s.RegisterName("RPCServer", new(RPCServer), "")
if err := s.Server("tcp", ":8899"); err != nil {
log.Fatalln(err)
}
fmt.Println("server starting...")
}()
time.Sleep(1 * time.Second)
// 构造Client.
c, err := client.NewClient("tcp", ":8899", nil)
c.Trace = true
if err != nil {
log.Fatalln(err)
}
args := &Args{
Age: 100,
Name: "张三",
}
response := &Response{}
err = c.Call(context.Background(), "RPCServer", "Add", args, response)
if err != nil {
// timeout.
log.Fatalln(err)
}
}
type Args struct {
Name string
Age int64
}
type Response struct {
Result string
Age int64
Data struct {
List []int
}
}
// RPCServer 服务.
type RPCServer struct {
}
func (r *RPCServer) Add(c context.Context, args *Args, res *Response) error {
res.Result = "hello word" + args.Name
res.Age = 10 * args.Age
if res.Data.List == nil {
res.Data.List = make([]int, 0, 10)
}
for i := 0; i < 10; i++ {
res.Data.List = append(res.Data.List, i)
}
//time.Sleep(2 * time.Second)
return nil
}消息的组成部分:
- 第一个字节:魔数
- 第二个字节:版本
- 第三个字节:请求类型
- 第四个字节:超时控制
- 第五个字节到第八个字节:payload length,请求体长度
- 第9个字节到第12个字节:data length 相应长度
- 第13个字节到第16个字节:请求服务名称长度
- 第17个字节到第20个字节:请求方法名称长度
sl+ml+pl+dl长度字节就是本次请求内容,依次为服务名称、方法名称、请求体、响应体。