|
@@ -3,6 +3,7 @@ package ws
|
|
|
import (
|
|
|
"errors"
|
|
|
"eta/eta_api/utils"
|
|
|
+ "fmt"
|
|
|
"github.com/gorilla/websocket"
|
|
|
"sync"
|
|
|
"time"
|
|
@@ -10,20 +11,24 @@ import (
|
|
|
|
|
|
// Session 会话结构
|
|
|
type Session struct {
|
|
|
- ID string
|
|
|
- UserID int
|
|
|
+ Id string
|
|
|
+ UserId int
|
|
|
Conn *websocket.Conn
|
|
|
LastActive time.Time
|
|
|
Latency *LatencyMeasurer
|
|
|
History []string
|
|
|
CloseChan chan struct{}
|
|
|
- MessageChan chan []byte
|
|
|
+ MessageChan chan *Message
|
|
|
mu sync.RWMutex
|
|
|
}
|
|
|
+type Message struct {
|
|
|
+ MessageType string
|
|
|
+ message []byte
|
|
|
+}
|
|
|
|
|
|
// readPump 处理读操作
|
|
|
func (s *Session) readPump() {
|
|
|
- defer manager.RemoveSession(s.ID)
|
|
|
+ defer manager.RemoveSession(s.Id)
|
|
|
s.Conn.SetReadLimit(maxMessageSize)
|
|
|
_ = s.Conn.SetReadDeadline(time.Now().Add(60 * time.Second))
|
|
|
for {
|
|
@@ -32,19 +37,22 @@ func (s *Session) readPump() {
|
|
|
handleCloseError(err)
|
|
|
return
|
|
|
}
|
|
|
+ fmt.Printf("用户读取数据:%s", string(message))
|
|
|
// 更新活跃时间
|
|
|
s.mu.Lock()
|
|
|
s.LastActive = time.Now()
|
|
|
s.mu.Unlock()
|
|
|
// 处理消息
|
|
|
- if err = manager.HandleMessage(s.UserID, s.ID, message); err != nil {
|
|
|
-
|
|
|
+ if err = manager.HandleMessage(s.UserId, s.Id, message); err != nil {
|
|
|
+ //写应答
|
|
|
+ s.Conn.WriteMessage(websocket.TextMessage, []byte(err.Error()))
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// writePump 处理写操作
|
|
|
func (s *Session) writePump() {
|
|
|
+ fmt.Printf("用户写入数据")
|
|
|
ticker := time.NewTicker(basePingInterval)
|
|
|
defer ticker.Stop()
|
|
|
for {
|
|
@@ -53,7 +61,7 @@ func (s *Session) writePump() {
|
|
|
if !ok {
|
|
|
return
|
|
|
}
|
|
|
- _ = s.Conn.WriteMessage(websocket.TextMessage, message)
|
|
|
+ _ = s.Conn.WriteMessage(websocket.TextMessage, message.message)
|
|
|
case <-ticker.C:
|
|
|
_ = s.Latency.SendPing(s.Conn)
|
|
|
ticker.Reset(s.Latency.lastLatency)
|
|
@@ -85,9 +93,23 @@ func (s *Session) forceClose() {
|
|
|
s.Conn.WriteControl(websocket.CloseMessage,
|
|
|
websocket.FormatCloseMessage(websocket.ClosePolicyViolation, "heartbeat failed"),
|
|
|
time.Now().Add(5*time.Second))
|
|
|
-
|
|
|
s.Conn.Close()
|
|
|
utils.FileLog.Info("连接已强制关闭",
|
|
|
- "user", s.UserID,
|
|
|
- "session", s.ID)
|
|
|
+ "user", s.UserId,
|
|
|
+ "session", s.Id)
|
|
|
+}
|
|
|
+
|
|
|
+func NewSession(userId int, sessionId string, conn *websocket.Conn) (session *Session) {
|
|
|
+ session = &Session{
|
|
|
+ UserId: userId,
|
|
|
+ Id: sessionId,
|
|
|
+ Conn: conn,
|
|
|
+ History: []string{},
|
|
|
+ CloseChan: make(chan struct{}),
|
|
|
+ MessageChan: make(chan *Message),
|
|
|
+ }
|
|
|
+ session.Latency = SetupLatencyMeasurement(conn)
|
|
|
+ go session.readPump()
|
|
|
+ go session.writePump()
|
|
|
+ return
|
|
|
}
|