wsrv

package
v1.4.5 Latest Latest
Warning

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

Go to latest
Published: Dec 30, 2020 License: MIT Imports: 9 Imported by: 0

README

websocket 服务

开箱即用的 websocket 服务

协议

心跳

心跳包为长度为 0 的空数据包,最长时间 30s 发一次,否则链接将会被断开

请求响应数据

请求和响应的数据必须按照该协议来

请求数据

{
  "cmd": "register",
  "seqno": "unique string",
  "data": {}
}
  • cmd 命令名称
  • seqno 请求标识符
  • data 请求数据

响应数据

{
  "cmd": "register",
  "seqno": "unique string",
  "msg": "ok",
  "status": 0,
  "data": {}
}
  • cmd 命令名称,原样返回
  • seqno 请求标识符,原样返回
  • msg 处理后的消息,如果消息是处理成功的,默认都是 ok
  • status 错误状态码,0 为成功,非 0 为失败
  • data 响应数据

使用

示例概览

package main

import (
  "net/http"
  "github.com/go-eyas/toolkit/log"
  "github.com/go-eyas/toolkit/websocket"
  "github.com/go-eyas/toolkit/websocket/wsrv"
)
func main() {
  server := wsrv.New(&websocket.Config{
    MsgType: websocket.TextMessage, // 消息类型 websocket.TextMessage | websocke.BinaryMessage
  })

  server.Use(func(c *wsrv.Context) {
  	log.Debugf("ws request middleware, sid=%d, cmd=%s, data=%s", c.SessionID, c.CMD, string(c.Request.Data))
  	c.Next()
  	log.Debugf("ws response middleware, sid=%d cmd=%s, data=%v", c.SessionID, c.CMD, c.Response.Data)
  })
  server.Use(func(c *wsrv.Context) {
    if c.CMD != "register" {
      _, ok := c.Get("uid").(int)
      if !ok {
        
        c.Abort()
      }
    }
  })

  server.Handle("register", func(c *wsrv.Context) {
    body := &struct {
     UID int64
    }{}
    err := c.Bind(body)
    if err != nil {
      panic(err)
    }
    c.Set("uid", body.UID)
    
    // server push
    for sid, vals := range server.Session {
      if uid, ok := vals["uid"]; ok {
        server.Push(sid, &wsrv.WSResponse{
          CMD: "have_user_register",
          Data: map[string]interface{}{
            "uid": uid,
          },
        })
      } 
    }

    // server push current connection
    c.Push(&wsrv.WSResponse{
      CMD: "user_register",
      Data: map[string]interface{}{
        "uid": body.UID,
      },
    })

    c.OK()
  })
  server.Handle("userinfo", func(c *wsrv.Context) {
    uid := c.Get("uid").(int)
    c.OK(GetUserInfoByID(uid))
  })

  http.HandleFunc("/ws", server.Engine.HTTPHandler)
  http.ListenAndServe("127.0.0.1:8800", nil)
}

API

API 文档

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Context

type Context struct {
	Values map[string]interface{} // 该会话注册的值

	CMD        string             // 命令名称
	Seqno      string             // 请求唯一标识符
	RawData    json.RawMessage    // 请求原始数据 data
	SessionID  uint64             // 会话ID
	Socket     *websocket.Conn    // 长连接对象
	RawMessage *websocket.Message // 原始消息对象
	Engine     *websocket.WS      // 引擎
	Server     *WebsocketServer   // 服务器对象
	Payload    []byte             // 请求原始消息报文
	Request    *WSRequest         // 已解析的请求数据
	Response   *WSResponse        // 响应数据
	// contains filtered or unexported fields
}

Context 请求上下文

func (*Context) Abort

func (c *Context) Abort()

Abort 停止后面的处理函数和中间件执行

func (*Context) Bind

func (c *Context) Bind(v interface{}) error

Bind 解析并 JSON 绑定 data 数据到结构体,并验证数据正确性

func (*Context) Get

func (c *Context) Get(key string) interface{}

Get 获取会话的值

func (*Context) Next added in v1.3.0

func (c *Context) Next()

调用下个中间件

func (*Context) OK

func (c *Context) OK(args ...interface{})

OK 响应成功数据

func (*Context) Push

func (c *Context) Push(data *WSResponse) error

Push 服务器主动推送消息至该连接的客户端

func (*Context) Set

func (c *Context) Set(key string, v interface{})

Set 设置会话的上下文的值,注意设置的值在整个会话生效,不仅仅在本次上下文请求而已

type WSHandler

type WSHandler func(*Context)

WSHandler 请求处理器

type WSRequest

type WSRequest struct {
	CMD   string          `json:"cmd"`
	Seqno string          `json:"seqno"`
	Data  json.RawMessage `json:"data"`
}

WSRequest 请求数据

type WSResponse

type WSResponse struct {
	CMD    string      `json:"cmd"`
	Seqno  string      `json:"seqno"`
	Status int         `json:"status"`
	Msg    string      `json:"msg"`
	Data   interface{} `json:"data"`
}

WSResponse 响应数据

type WebsocketServer

type WebsocketServer struct {
	Engine *websocket.WS
	Config *websocket.Config

	Session map[uint64]map[string]interface{} // map[sid]SessionData
	// contains filtered or unexported fields
}

WebsocketServer 服务器

func New

func New(conf *websocket.Config) *WebsocketServer

New 新建服务器实例

func (*WebsocketServer) Destroy

func (ws *WebsocketServer) Destroy(sid uint64)

Destroy 销毁清理连接

func (*WebsocketServer) Handle

func (ws *WebsocketServer) Handle(cmd string, handlers ...WSHandler)

Handle 注册 CMD 路由监听器

func (*WebsocketServer) Push

func (ws *WebsocketServer) Push(sid uint64, data *WSResponse) error

Push 服务器推送消息到客户端

func (*WebsocketServer) Use added in v1.3.0

func (srv *WebsocketServer) Use(h ...WSHandler)

处理器中间件

Jump to

Keyboard shortcuts

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