go gin配置websocket(copy直接可用)

主要依赖
 

"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"

 websocket.go 

package server

import (
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/go-emix/utils"
	"github.com/gorilla/websocket"
	"log"
	"net/http"
	"sync"
)

type SocketSession struct {
	c  *websocket.Conn
	Id string
}

func (r *SocketSession) SendString(data string) error {
	return r.c.WriteMessage(websocket.TextMessage, []byte(data))
}

func (r *SocketSession) SendJson(data interface{}) error {
	return r.c.WriteJSON(data)
}

type SocketSessionSet struct {
	mux sync.RWMutex
	set map[string]*SocketSession
}

var SocketSessionMiss = errors.New("socket session miss")

func (on *SocketSessionSet) add(s *SocketSession) {
	on.mux.Lock()
	on.set[s.Id] = s
	on.mux.Unlock()
}

func (on *SocketSessionSet) Get(id string) (s *SocketSession, err error) {
	on.mux.RLock()
	defer on.mux.RUnlock()
	s, ok := on.set[id]
	if !ok {
		err = SocketSessionMiss
	}
	return
}

func (on *SocketSessionSet) delete(id string) *SocketSession {
	s, err := on.Get(id)
	if err == nil {
		on.mux.Lock()
		delete(on.set, id)
		on.mux.Unlock()
		return s
	}
	return nil
}

func (on *SocketSessionSet) Counts() int {
	on.mux.RLock()
	defer on.mux.RUnlock()
	return len(on.set)
}

type OnMsgReceive func(id string, message []byte)

type OnConnectOpen func(id string)

type OnConnectClose func(id string)

//gin config url path must be  /../:id
func SocketEndpoint(receive OnMsgReceive, open OnConnectOpen, clos OnConnectClose) (hand gin.HandlerFunc, set *SocketSessionSet) {
	var up = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {
		return true
	}}
	set = &SocketSessionSet{set: map[string]*SocketSession{}}
	hand = func(c *gin.Context) {
		var mid = struct {
			Id string `uri:"id" binding:"required"`
		}{}
		e := c.ShouldBindUri(&mid)
		utils.PanicError(e)
        // 添加子协议可以用来传参,作为验证身份
        header := c.GetHeader("Sec-WebSocket-Protocol")
		up.Subprotocols = []string{header}
		if header == "" {
			c.JSON(http.StatusOK, "failed")
			return
		}
		conn, e := up.Upgrade(c.Writer, c.Request, nil)
		utils.PanicError(e)
		session := &SocketSession{c: conn, Id: mid.Id}
		set.add(session)
		open(mid.Id)
		conn.SetCloseHandler(func(code int, text string) error {
			clos(mid.Id)
			set.delete(mid.Id)
			return nil
		})
		defer func() {
			if e := recover(); e != nil {
				log.Println(e)
			}
			err := conn.Close()
			if err != nil {
				log.Println("socket close err", err)
			}
		}()
		for {
			_, message, err := conn.ReadMessage()
			if err != nil {
				break
			}
			receive(mid.Id, message)
		}
	}
	return
}

 使用

var soks *SocketSessionSet

func ApiFunc(r gin.IRouter) {
	var sochand gin.HandlerFunc
	sochand, soks = SocketEndpoint(rece, open, clos)
	r.GET("socket/:id", sochand)
}

func rece(id string, mes []byte) {
	fmt.Println(id, " ", string(mes))
}

func open(id string) {
	fmt.Println(id, " open")
}

func clos(id string) {
	fmt.Println(id, " close")
}

 

Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用GinWebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用Golang和Gin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang GinWebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用Gin和Golang的标准库来构建强大的Web应用程序,并处理WebSocket通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值