Skip to content

Commit d5d0f26

Browse files
author
yiv
committed
update game agent
1 parent 820e874 commit d5d0f26

File tree

5 files changed

+426
-0
lines changed

5 files changed

+426
-0
lines changed

agent/client/main.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"log"
7+
"net/url"
8+
"strconv"
9+
10+
"github.com/gogo/protobuf/proto"
11+
"github.com/gorilla/websocket"
12+
13+
"github.com/yiv/yivgame/game/pb"
14+
)
15+
16+
var (
17+
agentAddr string = ":10050"
18+
)
19+
20+
type client struct {
21+
sk *websocket.Conn
22+
uid int64
23+
token string
24+
roomClass int32
25+
player *pb.Player
26+
}
27+
28+
func newClient(uid int64) (c *client) {
29+
c = &client{
30+
sk: newWebSocket(),
31+
uid: uid,
32+
token: strconv.FormatInt(uid, 10),
33+
roomClass: 3,
34+
}
35+
36+
return
37+
}
38+
39+
func (c *client) recv(errChan chan error) {
40+
for {
41+
_, message, err := c.sk.ReadMessage()
42+
if err != nil {
43+
log.Println("read:", err)
44+
errChan <- err
45+
return
46+
}
47+
code, pbBytes := splitBytes(message)
48+
if code == 10018 {
49+
res := &pb.GeRes{}
50+
proto.Unmarshal(pbBytes, res)
51+
fmt.Printf("[返回]发消息[code: %v]\n", res.Code)
52+
} else if code == 20019 {
53+
res := &pb.ChatMsg{}
54+
proto.Unmarshal(pbBytes, res)
55+
fmt.Printf("[通知]信息[发者: %v,编号:%v]\n", res.Sid, res.Mid)
56+
} else {
57+
res := &pb.GeRes{}
58+
proto.Unmarshal(pbBytes, res)
59+
fmt.Printf("[返回]未知[code: %v]\n", res.Code)
60+
}
61+
fmt.Printf("\n 17=消息\n\n")
62+
}
63+
}
64+
func (c *client) send(errChan chan error) {
65+
var cmdCode uint32
66+
fmt.Println("=======命令行启动=====")
67+
for {
68+
fmt.Scanln(&cmdCode)
69+
70+
if cmdCode == 100 {
71+
c.sk.Close()
72+
continue
73+
} else if cmdCode == 99 {
74+
c.enterTable()
75+
continue
76+
} else {
77+
cmdCode += 10000
78+
}
79+
80+
fmt.Printf("输入命令: %v\n", cmdCode)
81+
err := c.sk.WriteMessage(websocket.BinaryMessage, toBytes(cmdCode, nil))
82+
if err != nil {
83+
fmt.Println("命令发送错误:", err)
84+
errChan <- err
85+
return
86+
}
87+
}
88+
89+
}
90+
91+
func newWebSocket() *websocket.Conn {
92+
u := url.URL{Scheme: "ws", Host: agentAddr, Path: "/ws"}
93+
log.Printf("connecting to %s", u.String())
94+
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
95+
if err != nil {
96+
log.Fatal("dial:", err)
97+
}
98+
fmt.Println("socket connected ")
99+
return c
100+
}
101+
func splitBytes(payload []byte) (code uint32, pbBytes []byte) {
102+
code = uint32(payload[0])<<24 | uint32(payload[1])<<16 | uint32(payload[2])<<8 | uint32(payload[3])
103+
pbBytes = payload[4:]
104+
return
105+
}
106+
func toBytes(i uint32, pbBytes []byte) (payload []byte) {
107+
payload = append(payload, byte(i>>24), byte(i>>16), byte(i>>8), byte(i))
108+
payload = append(payload, pbBytes...)
109+
return
110+
}
111+
112+
var (
113+
uid = flag.Int("uid", 1, "the client uid")
114+
)
115+
116+
var (
117+
userMap = map[int]int64{
118+
1: 953685341995009,
119+
2: 2232870895617,
120+
}
121+
)
122+
123+
func main() {
124+
flag.Parse()
125+
uid := userMap[*uid]
126+
errChan := make(chan error)
127+
cli := newClient(uid)
128+
go cli.recv(errChan)
129+
go cli.send(errChan)
130+
fmt.Println("terminate by err :", <-errChan)
131+
}

agent/main.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"net/http"
7+
"net/http/pprof"
8+
"os"
9+
"os/signal"
10+
"syscall"
11+
12+
"github.com/prometheus/client_golang/prometheus/promhttp"
13+
"google.golang.org/grpc"
14+
15+
"github.com/go-kit/kit/log"
16+
"github.com/go-kit/kit/log/level"
17+
18+
"github.com/yiv/yivgame/agent/service"
19+
"github.com/yiv/yivgame/game/pb"
20+
)
21+
22+
var (
23+
webSocketAddr = flag.String("websocket.addr", ":10050", "game agent webSocket address")
24+
gameServer = flag.String("grpc.gameserver", ":10020", "game server gRPC server address")
25+
debugAddr = flag.String("debug.addr", ":10051", "Debug and metrics listen address")
26+
)
27+
28+
func main() {
29+
flag.Parse()
30+
31+
// Logging domain.
32+
var logger log.Logger
33+
{
34+
logger = log.NewLogfmtLogger(os.Stdout)
35+
logger = level.NewFilter(logger, level.AllowDebug())
36+
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
37+
logger = log.With(logger, "caller", log.DefaultCaller)
38+
}
39+
logger.Log("msg", "hello")
40+
defer logger.Log("msg", "goodbye")
41+
42+
// Mechanical domain.
43+
errc := make(chan error)
44+
// Interrupt handler.
45+
go func() {
46+
c := make(chan os.Signal)
47+
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
48+
errc <- fmt.Errorf("%s", <-c)
49+
}()
50+
51+
// gRPC transport.
52+
conn, err := grpc.Dial(*gameServer, grpc.WithInsecure())
53+
if err != nil {
54+
errc <- err
55+
return
56+
}
57+
defer conn.Close()
58+
client := pb.NewGameServiceClient(conn)
59+
60+
// Business domain.
61+
agentService := service.NewAgentService(client, logger)
62+
63+
// webSocket transport.
64+
go func() {
65+
logger := log.With(logger, "transport", "webSocket")
66+
m := http.NewServeMux()
67+
m.HandleFunc("/", agentService.WebSocketServer)
68+
logger.Log("addr", *webSocketAddr)
69+
errc <- http.ListenAndServe(*webSocketAddr, m)
70+
}()
71+
72+
// Debug listener.
73+
go func() {
74+
logger := log.With(logger, "transport", "debug")
75+
76+
m := http.NewServeMux()
77+
m.Handle("/debug/pprof/", http.HandlerFunc(pprof.Index))
78+
m.Handle("/debug/pprof/cmdline", http.HandlerFunc(pprof.Cmdline))
79+
m.Handle("/debug/pprof/profile", http.HandlerFunc(pprof.Profile))
80+
m.Handle("/debug/pprof/symbol", http.HandlerFunc(pprof.Symbol))
81+
m.Handle("/debug/pprof/trace", http.HandlerFunc(pprof.Trace))
82+
m.Handle("/metrics", promhttp.Handler())
83+
84+
logger.Log("addr", *debugAddr)
85+
errc <- http.ListenAndServe(*debugAddr, m)
86+
}()
87+
logger.Log("terminated", <-errc)
88+
}

agent/service/frame.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package service
2+
3+
import (
4+
"github.com/yiv/yivgame/game/pb"
5+
)
6+
7+
func code2bytes(i uint32) (b []byte) {
8+
b = append(b, byte(i>>24), byte(i>>16), byte(i>>8), byte(i))
9+
return
10+
}
11+
func bytes2code(b []byte) (i uint32) {
12+
i = uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
13+
return
14+
}
15+
16+
func toframe(i uint32, pbBytes []byte) *pb.Frame {
17+
payload := append(code2bytes(i), pbBytes...)
18+
return &pb.Frame{Payload: payload}
19+
}
20+
func frameCode(f *pb.Frame) uint32 {
21+
payload := f.Payload
22+
return bytes2code(payload[0:4])
23+
}
24+
func framePBbytes(f *pb.Frame) []byte {
25+
payload := f.Payload
26+
return payload[4:]
27+
}

0 commit comments

Comments
 (0)