Files
public/mywebsocket/mywebsocket.go
2023-11-14 18:32:24 +08:00

81 lines
1.6 KiB
Go

package mywebsocket
/*
说明:第一个包 初始化client唯一id。消息id为100
*/
import (
"net/http"
"time"
"github.com/gorilla/websocket"
"github.com/xxjwxc/public/message"
"github.com/xxjwxc/public/mylog"
)
type ClientBody struct {
Code int `json:"code,omitempty"`
Data interface{} `json:"data,omitempty"`
}
type WSMessageType uint8
const (
WS_Login WSMessageType = 1 // 链接
WS_Close WSMessageType = 2 // 断线
)
type HandlerReadFunc func(messageType int, p []byte, err error) //ID , MESSAGEID,内容
type MyWebSocket struct {
conn *websocket.Conn
done chan struct{}
}
//websocket 初始化接口
/*
addr 地址,
path 域
handlerFunc 读到的消息回调
stateFunc 连接消息回调
timeOut 读取超时回调(0则永不超时)
*/
func NewWebSocket(url string, handlerFunc HandlerReadFunc, requestHeader http.Header, timeOut time.Duration) (*MyWebSocket, error) {
myWebSocket := &MyWebSocket{
conn: nil,
done: make(chan struct{}),
}
var err error
var resp *http.Response
myWebSocket.conn, resp, err = websocket.DefaultDialer.Dial(url, requestHeader)
if err != nil {
mylog.Error(resp)
return nil, err
}
go func() {
defer close(myWebSocket.done)
for {
messageType, message, err := myWebSocket.conn.ReadMessage()
handlerFunc(messageType, message, err)
}
}()
return myWebSocket, nil
}
func (wss *MyWebSocket) SendMessage(messageType int, p []byte) error {
if wss.conn != nil {
return wss.conn.WriteMessage(messageType, p)
}
return message.GetError(message.EmptyError)
}
func (wss *MyWebSocket) Close() {
wss.done <- struct{}{}
if wss.conn != nil {
wss.conn.Close()
}
}