parent
562df437c1
commit
c63f7332d7
@ -0,0 +1,86 @@
|
|||||||
|
package websocket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/taoshihan1991/imaptool/models"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewKefuServer(c *gin.Context) {
|
||||||
|
kefuId, _ := c.Get("kefu_name")
|
||||||
|
kefuInfo := models.FindUser(kefuId.(string))
|
||||||
|
if kefuInfo.ID == 0 {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"code": 400,
|
||||||
|
"msg": "用户不存在",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
go kefuServerBackend()
|
||||||
|
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Print("upgrade:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
//接受消息
|
||||||
|
var receive []byte
|
||||||
|
messageType, receive, err := conn.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取GET参数,创建WS
|
||||||
|
var kefu User
|
||||||
|
kefu.id = kefuInfo.Name
|
||||||
|
kefu.name = kefuInfo.Nickname
|
||||||
|
kefu.avator = kefuInfo.Avator
|
||||||
|
kefu.conn = conn
|
||||||
|
AddKefuToList(&kefu)
|
||||||
|
|
||||||
|
message <- &Message{
|
||||||
|
conn: conn,
|
||||||
|
content: receive,
|
||||||
|
context: c,
|
||||||
|
messageType: messageType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func AddKefuToList(kefu *User) {
|
||||||
|
var newKefuConns = []*User{kefu}
|
||||||
|
kefuConns := kefuList[kefu.id]
|
||||||
|
if kefuConns != nil {
|
||||||
|
newKefuConns = append(newKefuConns, kefuConns...)
|
||||||
|
}
|
||||||
|
kefuList[kefu.id] = newKefuConns
|
||||||
|
}
|
||||||
|
|
||||||
|
//后端广播发送消息
|
||||||
|
func kefuServerBackend() {
|
||||||
|
for {
|
||||||
|
message := <-message
|
||||||
|
var typeMsg TypeMessage
|
||||||
|
json.Unmarshal(message.content, &typeMsg)
|
||||||
|
conn := message.conn
|
||||||
|
if typeMsg.Type == nil || typeMsg.Data == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
msgType := typeMsg.Type.(string)
|
||||||
|
log.Println("客户端:", msgType)
|
||||||
|
|
||||||
|
switch msgType {
|
||||||
|
//心跳
|
||||||
|
case "ping":
|
||||||
|
msg := TypeMessage{
|
||||||
|
Type: "pong",
|
||||||
|
}
|
||||||
|
str, _ := json.Marshal(msg)
|
||||||
|
conn.WriteMessage(websocket.TextMessage, str)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package websocket
|
@ -0,0 +1,49 @@
|
|||||||
|
package websocket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
)
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
conn *websocket.Conn
|
||||||
|
name string
|
||||||
|
id string
|
||||||
|
avator string
|
||||||
|
to_id string
|
||||||
|
}
|
||||||
|
type Message struct {
|
||||||
|
conn *websocket.Conn
|
||||||
|
context *gin.Context
|
||||||
|
content []byte
|
||||||
|
messageType int
|
||||||
|
}
|
||||||
|
type TypeMessage struct {
|
||||||
|
Type interface{} `json:"type"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
}
|
||||||
|
type ClientMessage struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Avator string `json:"avator"`
|
||||||
|
Id string `json:"id"`
|
||||||
|
VisitorId string `json:"visitor_id"`
|
||||||
|
Group string `json:"group"`
|
||||||
|
Time string `json:"time"`
|
||||||
|
ToId string `json:"to_id"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
City string `json:"city"`
|
||||||
|
ClientIp string `json:"client_ip"`
|
||||||
|
Refer string `json:"refer"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var clientList = make(map[string]*User)
|
||||||
|
var kefuList = make(map[string][]*User)
|
||||||
|
var message = make(chan *Message)
|
||||||
|
var upgrader = websocket.Upgrader{}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
upgrader = websocket.Upgrader{
|
||||||
|
ReadBufferSize: 1024,
|
||||||
|
WriteBufferSize: 1024,
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue