学习笔记: 我家别墅靠大海/pitaya-learn
尝试集成功能:我家别墅靠大海/pitaya-game
如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!!
我是按代码的顺序记的笔记
测试一下tcp。server
服务器类型声明为game
组件名为testcomponet
写个one方法,客户端给我啥,我还给他啥,并且再额外推送一点数据。
package main
import (
"context"
"strings"
"github.com/topfreegames/pitaya/v2"
"github.com/topfreegames/pitaya/v2/acceptor"
"github.com/topfreegames/pitaya/v2/component"
"github.com/topfreegames/pitaya/v2/config"
)
type TestComponent struct {
component.Base
app pitaya.Pitaya
}
func NewTestComponent(app pitaya.Pitaya) *TestComponent {
return &TestComponent{
app: app,
}
}
func (c *TestComponent) One(ctx context.Context, msg []byte) ([]byte, error) {
s := c.app.GetSessionFromCtx(ctx)
s.Push("one", "i get one message")
s.Push("message", []byte("your message :"+string(msg)))
return msg, nil
}
var app pitaya.Pitaya
func main() {
// 配置
conf := config.NewDefaultBuilderConfig()
// 火龙果
builder := pitaya.NewDefaultBuilder(true, "game", pitaya.Cluster, map[string]string{}, *conf)
builder.AddAcceptor(acceptor.NewTCPAcceptor(":8999"))
app = builder.Build()
defer app.Shutdown()
tc := NewTestComponent(app)
app.Register(tc, component.WithName("testcomponent"), component.WithNameFunc(strings.ToLower))
app.Start()
}
由于通信是火龙果内部封装的,我们这边直接用他的client。
他这个调用请求的url,实际上是 -> 服务器类型.组件名.方法名
如果服务器类型和组件名一样的话,可以省略服务器类型
例如:服务器类型也是testcomponent
那么直接请求testcomponent.one就行了,不用game.
文档:Pitaya API — Pitaya documentation
package main
import (
"fmt"
"time"
"github.com/sirupsen/logrus"
"github.com/topfreegames/pitaya/v2/client"
)
func main() {
c := client.New(logrus.InfoLevel, 100*time.Millisecond)
err := c.ConnectTo("127.0.0.1:8999")
if err != nil {
fmt.Println(" conn server error :", err)
return
}
go func(c client.Client) {
for {
select {
case data := <-c.MsgChannel():
if data.Err {
fmt.Println("error :", string(data.Data))
break
}
fmt.Println("data --------------", string(data.Data))
}
}
}(*c)
for {
_, err := c.SendRequest("game.testcomponent.one", []byte("hello"))
if err != nil {
fmt.Println("send request error")
return
}
time.Sleep(time.Second)
}
}
再测试一下用结构体包裹参数
server这边一定要注意,message ,respone必须是指针
type TestMessage struct {
Message string `json:"message"`
}
type TestRespone struct {
Code int `json:"code"`
}
func (c *TestComponent) Two(ctx context.Context, msg *TestMessage) (*TestRespone, error) {
s := c.app.GetSessionFromCtx(ctx)
s.Push("two", "i get 2 message:"+msg.Message)
return &TestRespone{Code: 1}, nil
}
学习笔记4