安装leafserver
获取leafserver
git clone https://github.com/name5566/leafserver
设置leafserver目录为GOPATH
export GOPATH=/path/to/leafserver
获取leaf
go get github.com/name5566/leaf
编写心跳
修改msg/msg.go
package msg
import (
"github.com/name5566/leaf/network/json"
)
// 使用默认的 JSON 消息处理器(默认还提供了 protobuf 消息处理器)
var Processor = json.NewProcessor()
func init() {
// 这里我们注册了一个 JSON 消息 Hello
Processor.Register(&Heartbeat{})
}
// 一个结构体定义了一个 JSON 消息的格式
// 消息名为 Hello
type Heartbeat struct {
Name string
}
修改gate/router.go
package gate
import (
"server/game"
"server/msg"
)
func init() {
// 这里指定消息 Hello 路由到 game 模块
// 模块间使用 ChanRPC 通讯,消息路由也不例外
msg.Processor.SetRouter(&msg.Heartbeat{}, game.ChanRPC)
}
修改game/internal/handler.go
package internal
import (
"github.com/name5566/leaf/log"
"github.com/name5566/leaf/gate"
"reflect"
"server/msg"
)
func init() {
// 向当前模块(game 模块)注册 Hello 消息的消息处理函数 handleHello
handler(&msg.Heartbeat{}, handleHeartbeat)
}
func handler(m interface{}, h interface{}) {
skeleton.RegisterChanRPC(reflect.TypeOf(m), h)
}
func handleHeartbeat(args []interface{}) {
// 收到的 Hello 消息
m := args[0].(*msg.Heartbeat)
// 消息的发送者
a := args[1].(gate.Agent)
// 输出收到的消息的内容
log.Debug("MSG: %v", m.Name)
// 给发送者回应一个 Hello 消息
a.WriteMsg(&msg.Heartbeat{
Name: "client",
})
}
编译leafserver并启动
go install server
编写客户端发送心跳测定通信频率
package main
import (
"encoding/binary"
"net"
"fmt"
"strings"
"time"
"os"
)
//log函数
func Log(v ...interface{}) {
fmt.Println(v...)
return
}
//heartbeat消息
func Heartbeat(conn *net.TCPConn) {
fmt.Println("Connected to server.")
// Hello 消息(JSON 格式)
// 对应游戏服务器 Hello 消息结构体
data := []byte(`{
"Heartbeat": {
"Name": "Heartbeating!"
}
}`)
// len + data
m := make([]byte, 2+len(data))
// 默认使用大端序
binary.BigEndian.PutUint16(m, uint16(len(data)))
copy(m[2:], data)
// 发送消息
conn.Write(m)
//接收消息
request := make([]byte, 128)
//循环读取消息
fmt.Println("Message received from server.")
read_len, err := conn.Read(request)
if err != nil {
fmt.Println(err)
return
}
if read_len == 0 {
return
} else if strings.TrimSpace(string(request[:read_len])) != "" {
fmt.Println(strings.TrimSpace(string(request[:read_len])))
} else {
return
}
//清空上次读取内容
request = make([]byte, 128)
}
func main() {
server := "127.0.0.1:3563"
tcpAddr, err := net.ResolveTCPAddr("tcp4",server)
if err != nil{
Log(os.Stderr,"Fatal error:",err.Error())
os.Exit(1)
}
conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
panic(err)
}
t := time.Now().Unix()
z := 0
for {
Heartbeat(conn)
//time.Sleep(1 * time.Second)
s := time.Now().Unix()
z ++
if s == t+1 {
fmt.Println(z)
break
}
}
}
启动客户端测试
每次测定数值有所偏差但是完全满足60Hz的要求