websocket_packet

package module
v1.0.5 Latest Latest
Warning

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

Go to latest
Published: Mar 19, 2025 License: GPL-2.0 Imports: 16 Imported by: 0

README

websocket_packet

介绍
  • 针对github.com/gorilla/websocket不能高并发写入
  • 针对golang.org/x/net/websocket不能高并发的写入
  • 总的来说,读写效率提高了不少,但由于golang的Runtime的机制,内存的占用比 c/c++,及rust写的包高一些
软件架构
|
|- frame                              # 帧
|   |- codec.go                       # 帧解码器
|   |- frame.go                       # 帧结构
|   |- uity.go                        # 帧工具
|
|- session                            # session
|   |- session_config.go              # session配置
|   |- session_id.go                  # sessionId生成器
|   |- session_status.go              # session状态
|   |- websocket_session.go           # session接口
|
|- client.go                          # 客户端
|- example_test.go                    # 样例与测试 
|- server_handle.go                   # 服务端 
|- README.md                          # readme文件
安装教程
go get github.com/qdmc/websocket_packet
使用说明

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type CallbackHandles

type CallbackHandles struct {
	session.ConnectedCallBackHandle  // 建立链接后的回调
	session.DisConnectCallBackHandle // 断开链接后的回调
	session.FrameCallBackHandle      // 帧读取后的回调
}

CallbackHandles 回调组

type Client

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

Client websocket客户端,只有一个 Session,并自动发送ping帧(25秒)与自动回复pong帧

func NewClient

func NewClient(opt *ClientOptions) *Client

NewClient 生成一个客户端

Example
// 配置一个请求的header,将在服务的链接成功回调中获取到
dialHeader := http.Header{}
dialHeader.Add("token", "my_token_xxx")
client := NewClient(&ClientOptions{
	ReConnectMaxNum:   3,
	ReConnectInterval: 5,
	ConnectedCallback: func() {
		// do connected
	},
	DisConnectCallback: func(e error, db *session.ConnectionDatabase) {
		// do disconnect
	},
	MessageCallback: func(t byte, bs []byte) {
		// do frame message
	},
	RequestHeader: dialHeader,
	RequestTime:   30,
	PingTime:      25,
	IsStatistics:  false,
})
err := client.Dial("ws://127.0.0.1:8080")
if err != nil {
	fmt.Println("dialErr: ", err.Error())
}

func (*Client) Dial

func (c *Client) Dial(url string) error

Dial 链接到服务端

func (*Client) Disconnect

func (c *Client) Disconnect()

Disconnect 断开与服务器链接

func (*Client) GetOptions

func (c *Client) GetOptions() *ClientOptions

GetOptions 返回配置项

func (*Client) SendMessage

func (c *Client) SendMessage(frameType byte, payload []byte, keys ...uint32) (int, error)

SendMessage 发送消息到服务端

  • frameType 消息类型,1:text;2:binary;9:ping;10:pong; 如是close消息,请调用Disconnect()方法
  • payload 消息负载
  • keys 消息加密key[可选]

func (*Client) SetOptions

func (c *Client) SetOptions(opt *ClientOptions)

SetOptions 设置配置项

type ClientOptions

type ClientOptions struct {
	ReConnectMaxNum    int
	ReConnectInterval  int64
	ConnectedCallback  func()
	DisConnectCallback func(err error, db *session.ConnectionDatabase)
	MessageCallback    func(byte, []byte)
	RequestHeader      http.Header
	RequestTime        int64
	PingTime           int64
	IsStatistics       bool
}

ClientOptions 客户端配置

  • ReConnectMaxNum 非正常断开后的重链次数,<0:不重链;0:一直重链;>0:重链接的最大次数;默认是5次
  • ReConnectInterval 重链间隔(秒),默认是5秒,最小为一秒
  • ConnectedCallback 链接成功后的回调
  • DisConnectCallback 断开后的回调
  • MessageCallback 接收到消息的回调
  • RequestHeader 发送请求时携带额外的请求头
  • RequestTime 发送请求的最大时长(秒),默认:10;最小:3;最大:60
  • PingTime 自动发送pingFrame的时间(秒)配置, <1:关闭(默认值); 1~~25:都会配置为25秒; >120:都会配置为120秒
  • IsStatistics 是否开启流量统计,默认为false

func NewClientOption

func NewClientOption() *ClientOptions

NewClientOption 生成一个新的客户端配置

func (*ClientOptions) SetConnectedCb

func (o *ClientOptions) SetConnectedCb(f func()) *ClientOptions

SetConnectedCb 配置链接成功后的回调

func (*ClientOptions) SetDisconnectCb

func (o *ClientOptions) SetDisconnectCb(f func(err error, db *session.ConnectionDatabase)) *ClientOptions

SetDisconnectCb 配置断开后的回调

func (*ClientOptions) SetHeader

func (o *ClientOptions) SetHeader(h http.Header)

SetHeader 配置发送请求时携带额外的请求头

func (*ClientOptions) SetMessageCb

func (o *ClientOptions) SetMessageCb(f func(byte, []byte)) *ClientOptions

SetMessageCb 配置接收到消息的回调

func (*ClientOptions) SetReConnect

func (o *ClientOptions) SetReConnect(maxNum int, interval int64) *ClientOptions

SetReConnect 配置重连参数

  • maxNum 重链次数,<0:不重链;0:一直重链;>0:重链接的最大次数;默认是5次
  • interval 重链间隔(秒),默认是5秒,最小为一秒

type ClientStatus

type ClientStatus = session.Status

ClientStatus 客户端状态

type ServerHandlerInterface

type ServerHandlerInterface interface {
	SetCallbacks(*CallbackHandles)                                                     // 配置回调
	Len() int                                                                          // 返回客户端(Session)总数
	GetSessionOnce(id int64) (Session, error)                                          // 获取一个 Session
	GetSessionRange(start, end uint64) []Session                                       // 获取获取 Session 列表
	GetSessionWithIds(ids ...int64) map[int64]Session                                  // 获取获取 Session 列表
	DisConnect(id int64) error                                                         // 断开一个 Session
	ServeHTTP(w http.ResponseWriter, req *http.Request)                                // 实现net.http.Handler
	SetHandshakeCheckHandle(f func(req *http.Request) error)                           // 配置一个校验的握手的handle
	SendMessage(id int64, frameType byte, payload []byte, keys ...uint32) (int, error) // 发送消息到客户端
	SetStatistics(b bool)                                                              // 是否开启流量统计,在执行ServeHTTP之前有效,默认为false
	SetPingTime(t int64)                                                               // 配置自动发送pingFrame的时间(秒),在执行ServeHTTP之前有效,<1:关闭(默认值); 1~~25:都会配置为25秒; >120:都会配置为120秒
	SetTimeOut(i int64)                                                                // 配置 Session 超时,在执行ServeHTTP之前有效
}

ServerHandlerInterface 实现的业务

  • 校验websocket握手(Handshake)
  • net.http.Handler:实现ServeHTTP(w http.ResponseWriter, req *http.Request)
  • 管理session:查询,断开
  • 消息的接收与发送

func NewServerHandle

func NewServerHandle() ServerHandlerInterface

NewServerHandle 生成一个全局唯一的 ServerHandlerInterface

Example
serv := NewServerHandle()
// 配置回调
serv.SetCallbacks(&CallbackHandles{
	ConnectedCallBackHandle: func(id int64, req *http.Request) {
		// do connected
	},
	DisConnectCallBackHandle: func(id int64, s frame.CloseStatus, db *session.ConnectionDatabase) {
		// do disconnect
	},
	FrameCallBackHandle: func(id int64, t byte, bs []byte) {
		// do frame message
	},
})
serv.SetHandshakeCheckHandle(func(req *http.Request) error {
	// do Handshake
	return nil
})
// 配置超时
serv.SetTimeOut(60)
// 配置自动发送ping帧
serv.SetPingTime(10)
// 配置打开数据统计
serv.SetStatistics(true)
// ServerHandlerInterface 可以做为一个Http.HandlerFunc使用
http.Handle("/websocket", serv)
http.ListenAndServe(":8080", nil)

type Session

Session websocket链接通用接口

type SessionDb

type SessionDb = session.ConnectionDatabase

SessionDb 链接信息

Directories

Path Synopsis
Package frame 帧报文
Package frame 帧报文
Package session websocket链接
Package session websocket链接

Jump to

Keyboard shortcuts

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