解决跨域ws

pull/23/head
陶士涵 4 years ago
parent dc401ae174
commit a603c88a07

@ -5,7 +5,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/taoshihan1991/imaptool/models" "github.com/taoshihan1991/imaptool/models"
myws "github.com/taoshihan1991/imaptool/websocket" "github.com/taoshihan1991/imaptool/ws"
"log" "log"
"sort" "sort"
"time" "time"
@ -276,6 +276,16 @@ func singleBroadcaster() {
Data: userInfo, Data: userInfo,
} }
str, _ := json.Marshal(msg) str, _ := json.Marshal(msg)
//新版
mKefuConns := ws.KefuList[user.to_id]
if mKefuConns != nil {
for _, kefu := range mKefuConns {
kefu.Conn.WriteMessage(websocket.TextMessage, str)
}
}
//兼容旧版
kefuConns := kefuList[user.to_id] kefuConns := kefuList[user.to_id]
if kefuConns != nil { if kefuConns != nil {
for k, kefuConn := range kefuConns { for k, kefuConn := range kefuConns {
@ -283,13 +293,7 @@ func singleBroadcaster() {
kefuConn.WriteMessage(websocket.TextMessage, str) kefuConn.WriteMessage(websocket.TextMessage, str)
} }
} }
mKefuConns := myws.KefuList[user.to_id]
if mKefuConns != nil {
for k, kefu := range mKefuConns {
log.Println(k, "xxxxxxxx")
kefu.Conn.WriteMessage(websocket.TextMessage, str)
}
}
//客户上线发微信通知 //客户上线发微信通知
go SendServerJiang(userInfo["username"]) go SendServerJiang(userInfo["username"])
sendPingOnlineUsers() sendPingOnlineUsers()

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

@ -1 +0,0 @@
package websocket

@ -1,4 +1,4 @@
package websocket package ws
import ( import (
"encoding/json" "encoding/json"
@ -25,6 +25,14 @@ func NewKefuServer(c *gin.Context) {
log.Print("upgrade:", err) log.Print("upgrade:", err)
return return
} }
//获取GET参数,创建WS
var kefu User
kefu.Id = kefuInfo.Name
kefu.Name = kefuInfo.Nickname
kefu.Avator = kefuInfo.Avator
kefu.Conn = conn
AddKefuToList(&kefu)
for { for {
//接受消息 //接受消息
var receive []byte var receive []byte
@ -34,14 +42,6 @@ func NewKefuServer(c *gin.Context) {
return 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{ message <- &Message{
conn: conn, conn: conn,
content: receive, content: receive,
@ -65,6 +65,7 @@ func AddKefuToList(kefu *User) {
} }
} }
} }
log.Println(newKefuConns)
KefuList[kefu.Id] = newKefuConns KefuList[kefu.Id] = newKefuConns
} }
@ -79,7 +80,7 @@ func kefuServerBackend() {
continue continue
} }
msgType := typeMsg.Type.(string) msgType := typeMsg.Type.(string)
log.Println("客户端:", msgType) log.Println("客户端:", string(message.content))
switch msgType { switch msgType {
//心跳 //心跳

@ -0,0 +1,95 @@
package ws
import (
"encoding/json"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"github.com/taoshihan1991/imaptool/models"
"log"
)
func NewVisitorServer(c *gin.Context) {
go kefuServerBackend()
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
//获取GET参数,创建WS
vistorInfo := models.FindVisitorByVistorId(c.Query("visitor_id"))
if vistorInfo.VisitorId == "" {
c.JSON(200, gin.H{
"code": 400,
"msg": "访客不存在",
})
return
}
user := &User{
Conn: conn,
Name: vistorInfo.Name,
Avator: vistorInfo.Avator,
Id: vistorInfo.VisitorId,
To_id: vistorInfo.ToId,
}
AddVisitorToList(user)
for {
//接受消息
var receive []byte
messageType, receive, err := conn.ReadMessage()
if err != nil {
for uid, visitor := range ClientList {
if visitor.Conn == conn {
log.Println("删除用户", uid)
delete(ClientList, uid)
models.UpdateVisitorStatus(uid, 0)
userInfo := make(map[string]string)
userInfo["uid"] = uid
userInfo["name"] = visitor.Name
msg := TypeMessage{
Type: "userOffline",
Data: userInfo,
}
str, _ := json.Marshal(msg)
kefuConns := KefuList[visitor.To_id]
if kefuConns != nil {
for _, kefuConn := range kefuConns {
kefuConn.Conn.WriteMessage(websocket.TextMessage, str)
}
}
}
}
log.Println(err)
return
}
message <- &Message{
conn: conn,
content: receive,
context: c,
messageType: messageType,
}
}
}
func AddVisitorToList(user *User) {
//用户id对应的连接
ClientList[user.Id] = user
userInfo := make(map[string]string)
userInfo["uid"] = user.Id
userInfo["username"] = user.Name
userInfo["avator"] = user.Avator
msg := TypeMessage{
Type: "userOnline",
Data: userInfo,
}
str, _ := json.Marshal(msg)
//新版
mKefuConns := KefuList[user.To_id]
if mKefuConns != nil {
for _, kefu := range mKefuConns {
kefu.Conn.WriteMessage(websocket.TextMessage, str)
}
}
}

@ -1,8 +1,9 @@
package websocket package ws
import ( import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"net/http"
) )
type User struct { type User struct {
@ -45,5 +46,10 @@ func init() {
upgrader = websocket.Upgrader{ upgrader = websocket.Upgrader{
ReadBufferSize: 1024, ReadBufferSize: 1024,
WriteBufferSize: 1024, WriteBufferSize: 1024,
// 解决跨域问题
CheckOrigin: func(r *http.Request) bool {
return true
},
} }
} }
Loading…
Cancel
Save