goWs

package module
v0.0.9 Latest Latest
Warning

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

Go to latest
Published: May 7, 2022 License: MIT Imports: 6 Imported by: 0

README

goWs

基于gorilla封装的并发安全的Golang Websocket组件

结构体

WsConnection

// WsConnection 维护的websocket长连接.
type WsConnection struct {
	// 隐藏了内部字段
}

WsMessage

// WsMessage 定义了一个消息实体.
type WsMessage struct {
	// To 消息发送对象
	To MsgTo
	// MessageType The message types are defined in RFC 6455, section 11.8.
	MessageType int
	// Data 消息内容
	Data []byte
}

// ToType 定义了消息发送的对象类型.
type ToType string

// MsgTo 定义了消息发送的对象.
type MsgTo struct {
	ToType ToType
	To     string
}

通过WsMessage类,在内部进行对应消息的转发,如消息的一对一;一对多等。 1、WsMessageTo字段是内部自定义的一个类型MsgTo,指定了消息发送的对象, MsgTo包含字段ToType以及字段To:字段ToType即消息发送的对象类型,分别是ToAll(发送给所有在线连接)、ToGroup(发送给群组在线连接)以及ToConn(发送给指定连接); 字段To即具体对象。 2、MessageType是消息的具体类型; 3、Data是消息内容。

接口

type Conn interface {
	Close() error
	Open(w http.ResponseWriter, r *http.Request) error
	Receive() (msg *WsMessage, err error)
	Write(msg *WsMessage) (err error)
}

接口Conn对外暴露了4个方法。方法CloseCloseNewWsConnection构造的连接;方法Open会将HTTP服务器连接升级到WebSocket协议; 方法Receive接收客户端发送过来的消息;方法Write将消息发向客户端。

// Collection 业务方实现维护长连接的接口.
type Collection interface {
	// Set 将连接写入集合
	Set(id string, wsConn *WsConnection) error
	// Get 从集合中获取对应id的连接
	Get(id string) (wsConn *WsConnection, err error)
	// GetGroup 通过groupId获取对应的连接列表
	GetGroup(groupId string) (wsConnList []*WsConnection, err error)
	// GetAll 获取所有连接
	GetAll() (wsConnList []*WsConnection, err error)
	// Del 将id对应的连接从集合中删除
	Del(id string) error
}

接口Collection业务方实现维护长连接的接口。使用前,请先实现此接口。

// HeartBeater 业务方实现维持心跳的接口
type HeartBeater interface {
	// IsPingMsg 校验是否客户端Ping请求
	IsPingMsg(msg []byte) bool
	// GetPongMsg 获取服务端->客户端Pong请求数据
	GetPongMsg() []byte
	// GetHeartbeatTime 获取心跳间隔有效时间(单位是秒)。如果两次心跳大于这个有效时间,连接将断开
	GetHeartbeatTime() int
}

接口HeartBeater业务方实现维持心跳的接口。使用前,请先实现此接口。

方法说明

func NewWsConnection(collect Collection, heartBeater HeartBeater) *WsConnection

方法NewWsConnection为新建一个WsConnection类型的长连接。 入参collectCollection接口类的具体实现;入参heartBeaterHeartBeater接口的具体实现。

func (conn *WsConnection) Close() error
func (conn *WsConnection) Open(w http.ResponseWriter, r *http.Request) error
func (conn *WsConnection) Receive() (msg *WsMessage, err error)
func (conn *WsConnection) Write(msg *WsMessage) (err error)

上面4个方法是接口Conn对外暴露的4个方法。

快速开始

import (
   "fmt"
   ws "github.com/lcr2000/goWs"
   "net/http"
)

func WsHandler(w http.ResponseWriter, r *http.Request) {
   conn := NewWsConnection(collect{}, beat{})
   if err := conn.Open(w, r); err != nil {
   	return
   }
   for {
   	// 读取消息
   	msg, err := conn.Receive()
   	if err != nil {
   		break
   	}
   	fmt.Println(string(msg.Data))
   	// 发送消息
   	err = conn.Write(&WsMessage{
   		To:          msg.To,
   		MessageType: msg.MessageType,
   		Data:        msg.Data,
   	})
   	if err != nil {
   		break
   	}
   }
}

type collect struct{}

func (c collect) Set(id string, wsConn *ws.WsConnection) error {
   m.RLock()
   defer m.RUnlock()
   col[id] = wsConn
   return nil
}

func (c collect) Get(id string) (wsConn *ws.WsConnection, err error) {
   m.RLock()
   defer m.RUnlock()
   conn, ok := col[id]
   if !ok {
   	err = errors.New("id is not exist")
   	return
   }
   return conn, nil
}

func (c collect) GetGroup(groupId string) (wsConnList []*ws.WsConnection, err error) {
   m.RLock()
   defer m.RUnlock()
   for _, conn := range col {
   	wsConnList = append(wsConnList, conn)
   }
   return wsConnList, nil
}

func (c collect) GetAll() (wsConnList []*ws.WsConnection, err error) {
   m.RLock()
   defer m.RUnlock()
   for _, conn := range col {
   	wsConnList = append(wsConnList, conn)
   }
   return wsConnList, nil
}

func (c collect) Del(id string) error {
   delete(col, id)
   return nil
}

type beat struct{}

func (b beat) IsPingMsg(msg []byte) bool {
   return false
}

func (b beat) GetPongMsg() []byte {
   return []byte{}
}

func (b beat) GetHeartbeatTime() int {
   return 10
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// websocket连接已关闭
	ErrWsConnClose = errors.New("websocket connection closed")
	// websocket唯一连接id不能为空
	ErrIdEmpty = errors.New("id is null")
)

Functions

This section is empty.

Types

type Collection

type Collection interface {
	// Set 将连接写入集合
	Set(id string, wsConn *WsConnection) error
	// Get 从集合中获取对应id的连接
	Get(id string) (wsConn *WsConnection, err error)
	// GetGroup 通过groupId获取对应的连接列表
	GetGroup(groupId string) (wsConnList []*WsConnection, err error)
	// GetAll 获取所有连接
	GetAll() (wsConnList []*WsConnection, err error)
	// Del 将id对应的连接从集合中删除
	Del(id string) error
}

Collection 业务方实现维护长连接的接口.

type Conn

type Conn interface {
	Close() error
	Open(w http.ResponseWriter, r *http.Request) error
	Receive() (msg *WsMessage, err error)
	Write(msg *WsMessage) (err error)
}

type HeartBeater added in v0.0.5

type HeartBeater interface {
	// IsPingMsg 校验是否客户端Ping请求
	IsPingMsg(msg []byte) bool
	// GetPongMsg 获取服务端->客户端Pong请求数据
	GetPongMsg() []byte
	// GetHeartbeatTime 获取心跳间隔有效时间(单位是秒)。如果两次心跳大于这个有效时间,连接将断开
	GetHeartbeatTime() int
}

HeartBeater 业务方实现维持心跳的接口

type MsgTo

type MsgTo struct {
	ToType ToType
	To     string
}

MsgTo 定义了消息发送的对象.

type ToType

type ToType string

ToType 定义了消息发送的对象类型.

const (
	// 发送给所有在线连接
	ToAll ToType = "All"
	// 发送给群组在线连接
	ToGroup ToType = "Group"
	// 发送给指定连接
	ToConn ToType = "Conn"
)

描述了消息发送的对象

type WsConnection

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

WsConnection 维护的websocket长连接.

func NewWsConnection

func NewWsConnection(collect Collection, heartBeater HeartBeater) *WsConnection

NewWsConnection 新建一个WsConnection类型的长连接.

func (*WsConnection) Close

func (wc *WsConnection) Close() error

func (*WsConnection) GetWsConnId added in v0.0.5

func (wc *WsConnection) GetWsConnId() string

GetWsConnId 获取WsConnection中唯一连接id

func (*WsConnection) Open

func (*WsConnection) Receive

func (wc *WsConnection) Receive() (msg *WsMessage, err error)

func (*WsConnection) Write

func (wc *WsConnection) Write(msg *WsMessage) (err error)

type WsMessage

type WsMessage struct {
	// To 消息发送对象
	To MsgTo
	// MessageType The message types are defined in RFC 6455, section 11.8.
	MessageType int
	// Data 消息内容
	Data []byte
}

WsMessage 定义了一个消息实体.

Jump to

Keyboard shortcuts

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