判定leafserver的通訊頻率
安裝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的要求
相關文章
- 傅立葉能否還原出原始的所有訊號頻率
- 頻率元件 LL元件
- 通訊圈周盤點:工信部調整頻率使用規劃;POL全光擁抱中興通訊將軍山園區
- 一種測量頻率的方法
- Laravel 後臺與爬蟲互動-通過 Redis 的頻道訂閱來通訊Laravel爬蟲Redis
- Django(64)頻率認證原始碼分析與自定義頻率認證Django原始碼
- MD800多機變頻器EtherCat通訊控制
- 簡述為什麼通訊原理中正數的相頻是0
- w10如何設頻率_win10怎樣設定螢幕頻率Win10
- 程序間的通訊(訊號通訊)
- 高頻率使用的免費API介面分享API
- 在Linux中用軟體降低CPU的頻率Linux
- [Leetcode]895.最大頻率棧LeetCode
- 頻率域濾波基本操作
- jmeter 的指標判定JMeter指標
- 高頻考點,六大程式通訊機制總結
- 記憶體條頻率越高越好嗎 記憶體條頻率高了有什麼用記憶體
- 檢視Oracle的redo日誌切換頻率Oracle
- 等精度頻率計的設計與驗證
- 如何計算振盪電路的固有頻率
- nginx根據token做頻率限制Nginx
- python 計算txt文字詞頻率Python
- Laravel 佇列執行頻率限制Laravel佇列
- Trie樹:字串頻率統計排序字串排序
- go最大堆 實現頻率排序Go排序
- 離散傅立葉變換的衍生,負頻率、fftshift、實訊號、共軛對稱FFT
- 頻率響度、靈敏度、總諧波失真(THD)和訊雜比(SNR)
- 檢視oracle的redo日誌組切換頻率Oracle
- 工作中高頻率使用的好用免費API分享API
- iOS使用頻率最高的四種記憶體管理iOS記憶體
- Spacex是什麼?主要使用的頻率是哪些?
- 是指兩個或更多不同頻率的訊號混合輸入到無源器件中
- Lumen 使用 throttle 限制介面訪問頻率
- linux檢視網路報文頻率Linux
- 1636 按照頻率將陣列升序排序陣列排序
- MFCC(梅爾頻率倒譜系數)
- DRF-認證許可權頻率
- DRF之許可權和頻率限制