应用集成平台服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.0 KiB

package webstocetmsg
import (
"context"
"encoding/json"
"errors"
"fmt"
"net"
"net/http"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
var upGraderes = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func (a *ApiMethod) Regist(c *gin.Context) {
conn, err := upGraderes.Upgrade(c.Writer, c.Request, nil)
if err != nil {
fmt.Println("websocket error:", err)
return
}
//得到客户的连接ip和端口
fmt.Println("client connect:", conn.RemoteAddr())
go a.Do(conn)
}
func (a *ApiMethod) Do(conn *websocket.Conn) {
for {
//获取到前端发送过来的websocket消息
contentType, message, err := conn.ReadMessage()
if err != nil {
//判断是不是超时
if netErr, ok := err.(net.Error); ok {
if netErr.Timeout() {
fmt.Printf("ReadMessage timeout remote:%v\n", conn.RemoteAddr())
}
}
// 其他错误,如果是 1001 和 1000,就不打印日志
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseNormalClosure) {
fmt.Println("其他错误")
}
conn.Close()
//这边必须return,因为前端的链接可能某个时间段就断开链接了,要是没有return,会导致产生 repeated read on failed websocket connection报错,而且也可以防止内存泄露
return
}
fmt.Printf("contentType:%v\n", contentType)
fmt.Printf("message:%v\n", string(message))
//写入ws
msg := []byte("我是server")
err = conn.WriteMessage(1, msg)
if err != nil {
fmt.Println("发生错误了")
fmt.Println(err.Error())
}
}
}
func (c *Client) SendOut(message *Message) error {
content, err := json.Marshal(message.Content)
if err != nil {
return err
}
c.Send <- content
return nil
}
func (manager *ClientManager) Write(message *Message) error {
manager.RLock()
client, ok := manager.Clients[message.Recipient]
manager.RUnlock()
if !ok {
return errors.New("client miss [" + message.Recipient + "]")
}
return client.SendOut(message)
}
/*
*
@ 作者: 秦东
@ 时间: 2024-08-16 16:14:22
@ 功能: Start 方法提供监听注册注销以及续期的 channel通过监听这些 channel 来管理创建的连接对象当这些 channel 有数据时执行对应的操作
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (manager *ClientManager) Start(ctx context.Context) {
// for {
// select {
// case conn := <-manager.Register:
// manager.Lock()
// manager.Clients[conn.UUID] = conn
// manager.Unlock()
// _, err := manager.affair.Register(ctx, &RegisterReq{
// UserID: conn.UserID,
// UUID: conn.UUID,
// IP: manager.IP,
// })
// case conn := <-manager.Unregister:
// _, err := manager.affair.Unregister(ctx, &UnregisterReq{
// UserID: conn.UserID,
// UUID: conn.UUID,
// })
// conn.Socket.Close()
// close(conn.Send)
// delete(manager.Clients, conn.UUID)
// case conn := <-manager.Renewal:
// //...
// // Key renewal to redis
// }
// }
}