-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
100 lines (85 loc) · 2.06 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package service
import (
"fmt"
"net"
"reflect"
)
// 声明服务端
type Server struct {
//地址
addr string
//map 用于维护关系的
funcs map[string]reflect.Value
}
//构造方法
func NewServer(addr string) *Server {
return &Server{addr: addr, funcs: make(map[string]reflect.Value)}
}
// 服务端需要一个注册register
// 第一个参数函数名,第二个传入真正的函数
func (s *Server) Register(rpcName string, f interface{}) {
// 维护一个map
// 若map已经有键了
if _, ok := s.funcs[rpcName]; ok{
return
}
//若map中没有键
fVal := reflect.ValueOf(f)
fmt.Printf("%#v", fVal)
s.funcs[rpcName] = fVal
}
// 服务端等待调用的方法
func (s *Server) Run() {
//监听
lis, err := net.Listen("tcp", s.addr)
if err != nil {
fmt.Printf("监听 %s err : %v", s.addr, err)
return
}
for {
conn, err := lis.Accept()
if err != nil {
return
}
serSession := NewSession(conn)
//使用rpc方式读取数据
b, err := serSession.Read()
if err != nil {
return
}
//数据解码
rpcData, err := decode(b)
if err != nil {
return
}
//根据读到的name. 得到要调用的函数
f, ok := s.funcs[rpcData.Name]
if !ok {
fmt.Printf("函数 %s 不存在", rpcData.Name)
return
}
// 遍历解析客户端传来的参数。放切片里
inArgs := make([]reflect.Value, 0, len(rpcData.Args))
for _, arg := range rpcData.Args {
inArgs = append(inArgs, reflect.ValueOf(arg))
}
fmt.Printf("%#v \n", inArgs)
//反射调用方法
// 返回value类型,用于给客户端传递返回结果,out是所以的返回结果
out := f.Call(inArgs)
fmt.Printf("%#v", out)
//遍历out ,用于返回客户端,存到一个切片里
outArgs := make([]interface{}, 0, len(out))
for _, o := range out {
outArgs = append(outArgs, o.Interface())
}
// 数据编码 返回给客户端
respRpcData := RpcData{rpcData.Name, outArgs}
bytes, err := encode(respRpcData)
// 将服务端编码后的数据。写到客户端
err = serSession.Write(bytes)
if err != nil {
return
}
}
}