拆分和完善websocket服务

pull/23/head
taoshihan1991 4 years ago
parent 562df437c1
commit c63f7332d7

@ -17,6 +17,9 @@ func JwtPageMiddleware(c *gin.Context) {
}
func JwtApiMiddleware(c *gin.Context) {
token := c.GetHeader("token")
if token == "" {
token = c.Query("token")
}
userinfo := tools.ParseToken(token)
if userinfo == nil || userinfo["name"] == nil || userinfo["create_time"] == nil {
c.JSON(200, gin.H{

@ -4,6 +4,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/taoshihan1991/imaptool/controller"
"github.com/taoshihan1991/imaptool/middleware"
"github.com/taoshihan1991/imaptool/websocket"
)
func InitApiRouter(engine *gin.Engine) {
@ -13,6 +14,8 @@ func InitApiRouter(engine *gin.Engine) {
engine.POST("/check_auth", middleware.JwtApiMiddleware, controller.MainCheckAuth)
//前后聊天
engine.GET("/chat_server", middleware.Ipblack, controller.NewChatServer)
engine.GET("/ws_kefu", middleware.JwtApiMiddleware, websocket.NewKefuServer)
//获取消息
engine.GET("/messages", controller.GetVisitorMessage)
engine.GET("/message_notice", controller.SendVisitorNotice)

@ -7,6 +7,7 @@ var app=new Vue({
rightTabActive:"visitorInfo",
users:[],
usersMap:[],
//server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"),
server:getWsBaseUrl()+"/chat_server",
socket:null,
messageContent:"",

@ -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…
Cancel
Save