gnetserver

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 2, 2024 License: GPL-3.0 Imports: 18 Imported by: 0

Documentation

Index

Constants

View Source
const CtxKey_Text = utils.CtxKey("text") // 数据为text格式,否则为二进制格式 值:不受限制 一般写1
View Source
const CtxKey_WS = utils.CtxKey("ws") // 表示ws连接 值:不受限制 一般写1

Variables

View Source
var WSHeader = http.Header{
	"GOVersion": []string{runtime.Version()},
	"GOOS":      []string{runtime.GOOS},
	"GOARCH":    []string{runtime.GOARCH},
}

握手时给客户端回复的头,外部可修改

Functions

This section is empty.

Types

type ClientCreater

type ClientCreater interface {
	ClientCreate()
}

type ClientNamer

type ClientNamer interface {
	ClientName() string
}

type GNetClient

type GNetClient[ClientInfo any] struct {
	// contains filtered or unexported fields
}

ClientInfo是和业务相关的客户端信息结构 如果ClientInfo存在ClientCreate函数,创建链接时会调用 如果ClientInfo存在ClientName函数,输出日志是会调用

func (*GNetClient[ClientInfo]) Close

func (gc *GNetClient[ClientInfo]) Close(err error)

会回调event的OnDisConnect 若想不回调使用 GNetServer.CloseClient

func (*GNetClient[ClientInfo]) ConnName

func (gc *GNetClient[ClientInfo]) ConnName() string

func (*GNetClient[ClientInfo]) Info

func (gc *GNetClient[ClientInfo]) Info() *ClientInfo

func (*GNetClient[ClientInfo]) LocalAddr

func (gc *GNetClient[ClientInfo]) LocalAddr() string

func (*GNetClient[ClientInfo]) RemoteAddr

func (gc *GNetClient[ClientInfo]) RemoteAddr() string

func (*GNetClient[ClientInfo]) Send

func (gc *GNetClient[ClientInfo]) Send(ctx context.Context, data []byte) error

func (*GNetClient[ClientInfo]) SendMsg

func (gc *GNetClient[ClientInfo]) SendMsg(ctx context.Context, msg utils.SendMsger) error

SendMsg 发送消息对象,会调用消息对象的MsgMarshal来编码消息 消息对象可实现zerolog.LogObjectMarshaler接口,更好的输出日志,通过ParamConf.LogLevelMsg配置可控制日志级别

func (*GNetClient[ClientInfo]) SendText

func (gc *GNetClient[ClientInfo]) SendText(ctx context.Context, data []byte) error

type GNetEvent

type GNetEvent[ClientInfo any] interface {
	// 收到连接
	OnConnected(ctx context.Context, gc *GNetClient[ClientInfo])

	// 用户掉线
	OnDisConnect(ctx context.Context, gc *GNetClient[ClientInfo])

	// DecodeMsg 解码消息实现
	// 返回值为 msg,len,err
	// msg     解码出的消息体
	// len     解码消息的数据长度,内部根据len来删除已解码的数据
	// err     解码错误,若发生error,服务器将重连
	DecodeMsg(ctx context.Context, data []byte, gc *GNetClient[ClientInfo]) (interface{}, int, error)

	// Context 生成Context, 目前OnMsg、OnTick参数使用
	// msg为nil时 表示是OnTick调用
	Context(parent context.Context, msg interface{}) context.Context

	// OnRecv 收到消息,解码成功后调用 异步顺序调用
	OnMsg(ctx context.Context, msg interface{}, gc *GNetClient[ClientInfo])

	// tick每秒调用一次 异步调用
	OnTick(ctx context.Context, gc *GNetClient[ClientInfo])
}

type GNetEventHandler

type GNetEventHandler[ClientInfo any] struct {
}

GNetEventHandler GNetEvent的内置实现 如果不想实现GNetEvent的所有接口,可以继承它实现部分方法

func (*GNetEventHandler[ClientInfo]) Context

func (h *GNetEventHandler[ClientInfo]) Context(parent context.Context, msg interface{}) context.Context

func (*GNetEventHandler[ClientInfo]) DecodeMsg

func (*GNetEventHandler[ClientInfo]) DecodeMsg(ctx context.Context, data []byte, gc *GNetClient[ClientInfo]) (interface{}, int, error)

func (*GNetEventHandler[ClientInfo]) OnConnected

func (*GNetEventHandler[ClientInfo]) OnConnected(ctx context.Context, gc *GNetClient[ClientInfo])

func (*GNetEventHandler[ClientInfo]) OnDisConnect

func (*GNetEventHandler[ClientInfo]) OnDisConnect(ctx context.Context, gc *GNetClient[ClientInfo])

func (*GNetEventHandler[ClientInfo]) OnMsg

func (*GNetEventHandler[ClientInfo]) OnMsg(ctx context.Context, msg interface{}, gc *GNetClient[ClientInfo])

func (*GNetEventHandler[ClientInfo]) OnTick

func (*GNetEventHandler[ClientInfo]) OnTick(ctx context.Context, gc *GNetClient[ClientInfo])

type GNetHook

type GNetHook[ClientInfo any] interface {
	// 收到连接
	OnConnected(gc *GNetClient[ClientInfo])
	// ws连接握手
	OnWSHandShake(gc *GNetClient[ClientInfo])
	// 用户掉线,removeClient表示是否引起RemoveClient,但不会调用OnRemoveClient
	OnDisConnect(gc *GNetClient[ClientInfo], removeClient bool, closeReason error)

	// 添加Client
	OnAddClient(gc *GNetClient[ClientInfo])
	// 添加Client
	OnRemoveClient(gc *GNetClient[ClientInfo])

	// 发送数据
	OnSend(gc *GNetClient[ClientInfo], len int)
	// 接受数据
	OnRecv(gc *GNetClient[ClientInfo], len int)
}

Hook

type GNetServer

type GNetServer[ClientId any, ClientInfo any] struct {
	*gnet.EventServer
	// 不可需改
	Address string // 监听地址
	Scheme  string // scheme支持tcp和ws,为空表示tcp
	// contains filtered or unexported fields
}

GNetServer ClientId客户端ID类型 ClientInfo是和业务相关的客户端信息结构类型

func NewGNetServer

func NewGNetServer[ClientId any, ClientInfo any](port int, event GNetEvent[ClientInfo]) *GNetServer[ClientId, ClientInfo]

创建服务器 scheme支持tcp和ws,为空表示tcp

func NewGNetServerWS

func NewGNetServerWS[ClientId any, ClientInfo any](port int, event GNetEvent[ClientInfo]) *GNetServer[ClientId, ClientInfo]

func (*GNetServer[ClientId, ClientInfo]) AddClient

func (s *GNetServer[ClientId, ClientInfo]) AddClient(id ClientId, gc *GNetClient[ClientInfo])

添加用户映射

func (*GNetServer[ClientId, ClientInfo]) ClientCount

func (s *GNetServer[ClientId, ClientInfo]) ClientCount() int

func (*GNetServer[ClientId, ClientInfo]) CloseClient

func (s *GNetServer[ClientId, ClientInfo]) CloseClient(id ClientId)

主动关闭 不会回调事件的OnDisConnect 使用GNetClient.Close会回调事件的OnDisConnect

func (*GNetServer[ClientId, ClientInfo]) ConnCount

func (s *GNetServer[ClientId, ClientInfo]) ConnCount() (int, int)

func (*GNetServer[ClientId, ClientInfo]) Decode

func (s *GNetServer[ClientId, ClientInfo]) Decode(c gnet.Conn) ([]byte, error)

返回值[]byte 就是React的packet

func (*GNetServer[ClientId, ClientInfo]) Encode

func (s *GNetServer[ClientId, ClientInfo]) Encode(c gnet.Conn, buf []byte) ([]byte, error)

编解码原样返回

func (*GNetServer[ClientId, ClientInfo]) GetClient

func (s *GNetServer[ClientId, ClientInfo]) GetClient(id ClientId) *GNetClient[ClientInfo]

func (*GNetServer[ClientId, ClientInfo]) OnClosed

func (s *GNetServer[ClientId, ClientInfo]) OnClosed(c gnet.Conn, err error) (action gnet.Action)

func (*GNetServer[ClientId, ClientInfo]) OnInitComplete

func (s *GNetServer[ClientId, ClientInfo]) OnInitComplete(server gnet.Server) (action gnet.Action)

func (*GNetServer[ClientId, ClientInfo]) OnOpened

func (s *GNetServer[ClientId, ClientInfo]) OnOpened(c gnet.Conn) (out []byte, action gnet.Action)

func (*GNetServer[ClientId, ClientInfo]) OnShutdown

func (s *GNetServer[ClientId, ClientInfo]) OnShutdown(server gnet.Server)

func (*GNetServer[ClientId, ClientInfo]) RangeClient

func (s *GNetServer[ClientId, ClientInfo]) RangeClient(f func(gc *GNetClient[ClientInfo]) bool)

遍历Client f函数返回false 停止遍历

func (*GNetServer[ClientId, ClientInfo]) React

func (s *GNetServer[ClientId, ClientInfo]) React(packet []byte, c gnet.Conn) (out []byte, action gnet.Action)

func (*GNetServer[ClientId, ClientInfo]) RegHook

func (s *GNetServer[ClientId, ClientInfo]) RegHook(h GNetHook[ClientInfo])

注册hook

func (*GNetServer[ClientId, ClientInfo]) RemoveClient

func (s *GNetServer[ClientId, ClientInfo]) RemoveClient(id ClientId) *GNetClient[ClientInfo]

func (*GNetServer[ClientId, ClientInfo]) Send

func (s *GNetServer[ClientId, ClientInfo]) Send(ctx context.Context, id ClientId, data []byte) error

func (*GNetServer[ClientId, ClientInfo]) SendMsg

func (s *GNetServer[ClientId, ClientInfo]) SendMsg(ctx context.Context, id ClientId, msg utils.SendMsger) error

func (*GNetServer[ClientId, ClientInfo]) Start

func (s *GNetServer[ClientId, ClientInfo]) Start() error

开启监听

func (*GNetServer[ClientId, ClientInfo]) Stop

func (s *GNetServer[ClientId, ClientInfo]) Stop() error

func (*GNetServer[ClientId, ClientInfo]) Tick

func (s *GNetServer[ClientId, ClientInfo]) Tick() (delay time.Duration, action gnet.Action)

type ParamConfig

type ParamConfig struct {
	IgnoreIp []string `json:"ignoreip,omitempty"` // 建立连接和失去连接时,log输出忽略的ip, 支持?*通配符 不区分大小写
	// SendMsg接口中,输出日志等级会按照下面的配置来执行,否则按照Debug输出
	// 日志级别和zerolog.Level一致
	LogLevelMsg   int            `json:"loglevelmsg,omitempty"`   // msg消息默认的消息级别,不配置就是debug级别
	LogLevelByMsg map[string]int `json:"loglevelbymsg,omitempty"` // 根据消息ID区分的消息日志级别,消息ID:日志级别,不配置就使用LogLevelMsg级别

	ActiveTimeout int                 `json:"activetimeout,omitempty"` // 连接活跃超时时间 单位秒 <=0表示不检查活跃
	MsgSeq        bool                `json:"msgseq,omitempty"`        // 消息顺序执行
	WSHeader      map[string][]string `json:"wsheader,omitempty"`      // websocket握手时 回复的头
}

参数配置

func (*ParamConfig) Create

func (c *ParamConfig) Create()

func (*ParamConfig) IsIgnoreIp

func (c *ParamConfig) IsIgnoreIp(ip string) bool

func (*ParamConfig) MsgLogLevel

func (c *ParamConfig) MsgLogLevel(msgid string) int

func (*ParamConfig) Normalize

func (c *ParamConfig) Normalize()

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL