gn

package module
v0.0.0-...-e165b3a Latest Latest
Warning

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

Go to latest
Published: Apr 3, 2021 License: MIT Imports: 12 Imported by: 0

README

gn

fork自 https://github.com/alberliu/gn

原项目只支持epoll,不支持mac下使用,为开发方便添加mac支持 linux下使用epoll实现
mac下使用kqueque实现

简述

gn是一个基于linux下epoll的网络框架,目前只能运行在Linux下环境,gn可以配置处理网络事件的goroutine数量,相比golang原生库,在海量链接下,可以减少goroutine的开销,从而减少系统资源占用。

支持功能

1.tcp拆包粘包
通过调用系统recv_from函数,使用系统读缓存区实现拆包,减少用户态内存分配,使用sync.pool申请读写使用的字节数组,减少内存申请开销以及GC压力。
2.客户端超时踢出
可以设置超时时间,gn会定时检测超出超时的TCP连接(在指定时间内没有发送数据的连接),进行释放。

使用方式
package main

import (
	"gn"

	"time"
)

var log = gn.GetLogger()

var server *gn.Server

var encoder = gn.NewHeaderLenEncoder(2, 1024)

type Handler struct {
}

func (Handler) OnConnect(c *gn.Conn) {
	log.Info("connect:", c.GetFd(), c.GetAddr())
}
func (Handler) OnMessage(c *gn.Conn, bytes []byte) {
	encoder.EncodeToFD(c.GetFd(), bytes)
	log.Info("read:", string(bytes))
}
func (Handler) OnClose(c *gn.Conn, err error) {
	log.Info("close:", c.GetFd(), err)
}

func main() {
	var err error
	server, err = gn.NewServer(8080, &Handler{}, gn.NewHeaderLenDecoder(2),
		gn.WithTimeout(1*time.Second, 5*time.Second), gn.WithReadBufferLen(10))
	if err != nil {
		log.Info("err")
		return
	}

	server.Run()
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	MaxClient      = 10
	ErrReadTimeout = errors.New("tcp read timeout")
)

Functions

func NewHeaderLenEncoder

func NewHeaderLenEncoder(headerLen, writeBufferLen int) *headerLenEncoder

NewHeaderLenEncoder 创建基于头部长度的编码器 headerLen TCP包的头部内容,用来描述这个包的字节长度 writeBufferLen 服务器发送给客户端包的建议长度,当发送的包小于这个值时,会利用到内存池优化

func SockaddrToAddr

func SockaddrToAddr(sa syscall.Sockaddr) (syscall.SockaddrInet4, error)

Types

type Conn

type Conn struct {
	// contains filtered or unexported fields
}

Conn 客户端长连接

func (*Conn) Close

func (c *Conn) Close() error

Close 关闭连接

func (*Conn) GetAddr

func (c *Conn) GetAddr() string

GetAddr 获取客户端地址

func (*Conn) GetData

func (c *Conn) GetData() interface{}

GetData 获取数据

func (*Conn) GetFd

func (c *Conn) GetFd() int32

GetFd 获取文件描述符

func (*Conn) Read

func (c *Conn) Read() error

Read 读取数据

func (*Conn) SetData

func (c *Conn) SetData(data interface{})

SetData 设置数据

func (*Conn) Write

func (c *Conn) Write(bytes []byte) (int, error)

Write 写入数据

type Decoder

type Decoder interface {
	Decode(c *Conn) error
}

Decoder 解码器

func NewHeaderLenDecoder

func NewHeaderLenDecoder(headerLen int) Decoder

NewHeaderLenDecoder 创建基于头部长度的解码器 headerLen TCP包的头部内容,用来描述这个包的字节长度 readMaxLen 所读取的客户端包的最大长度,客户端发送的包不能超过这个长度

type Encoder

type Encoder interface {
	EncodeToFD(fd int32, bytes []byte) error
}

Encoder 编码器

type Handler

type Handler interface {
	OnConnect(c *Conn)               // OnConnect 当TCP长连接建立成功是回调
	OnMessage(c *Conn, bytes []byte) // OnMessage 当客户端有数据写入是回调
	OnClose(c *Conn, err error)      // OnClose 当客户端主动断开链接或者超时时回调,err返回关闭的原因
}

Handler Server 注册接口

type Option

type Option interface {
	// contains filtered or unexported methods
}

func WithAcceptGNum

func WithAcceptGNum(num int) Option

WithAcceptGNum 设置建立连接的goroutine数量

func WithIOEventQueueLen

func WithIOEventQueueLen(num int) Option

WithIOEventQueueLen 设置IO事件队列长度,默认值是1024

func WithIOGNum

func WithIOGNum(num int) Option

WithIOGNum 设置处理IO的goroutine数量

func WithReadBufferLen

func WithReadBufferLen(len int) Option

WithReadBufferLen 设置缓存区大小

func WithTimeout

func WithTimeout(timeoutTicker, timeout time.Duration) Option

WithTimeout 设置TCP超时检查的间隔时间以及超时时间

type Server

type Server struct {
	EventQueueNum int32               // 事件队列的数量
	EventQueues   []chan common.Event // 事件队列
	// contains filtered or unexported fields
}

server TCP服务

func NewServer

func NewServer(port int, handler Handler, decoder Decoder, opts ...Option) (*Server, error)

NewServer 创建server服务器

func (*Server) GetConn

func (s *Server) GetConn(fd int32) (*Conn, bool)

GetConn 获取Conn

func (*Server) GetConnsNum

func (s *Server) GetConnsNum() int64

GetConnsNum 获取当前长连接的数量

func (*Server) NewClientConn

func (s *Server) NewClientConn(caller string)

func (*Server) Run

func (s *Server) Run()

Run 启动服务

func (*Server) ShowConns

func (s *Server) ShowConns()

func (*Server) Stop

func (s *Server) Stop()

Run 启动服务

Directories

Path Synopsis
cmd
cli
srv

Jump to

Keyboard shortcuts

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