This commit is contained in:
苏尹岚
2020-08-19 15:32:53 +08:00
parent 094155d124
commit a3bc20820c

View File

@@ -1,6 +1,9 @@
package controllers
import (
"fmt"
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
@@ -18,6 +21,20 @@ type EventController struct {
beego.Controller
}
//连接的客户端,吧每个客户端都放进来
var clients = make(map[*websocket.Conn]bool)
//广播频道(通道)
var broadcast = make(chan Message)
// 配置升级程序(升级为websocket)
var upgrader = websocket.Upgrader{}
// 定义我们的消息对象
type Message struct {
Data interface{} `json:"data"`
}
// @Title 查询操作日志事件明细
// @Description 查询操作日志事件明细
// @Param token header string true "认证token"
@@ -92,15 +109,66 @@ func (c *EventController) GetWeixinUnlimited() {
// @Failure 200 {object} controllers.CallResult
// @router /TestWebsocket [get]
func (c *EventController) TestWebsocket() {
c.callTestWebsocket(func(params *tEventTestWebsocketParams) (retVal interface{}, errCode string, err error) {
var upgrader = websocket.Upgrader{}
conn, _ := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
go func(conn *websocket.Conn) {
for {
mType, msg, _ := conn.ReadMessage()
conn.WriteMessage(mType, msg)
}
}(conn)
return retVal, "", err
})
// 解决跨域问题(微信小程序)
upgrader.CheckOrigin = func(r *http.Request) bool {
return true
}
//升级将HTTP服务器连接升级到WebSocket协议。
//responseHeader包含在对客户端升级的响应中
//请求。使用responseHeader指定Cookie设置Cookie
//应用程序协商的子目录Sec WebSocket协议
//如果升级失败则升级将向客户端答复一个HTTP错误
ws, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
if err != nil {
log.Fatal(err)
}
defer ws.Close()
//将当前客户端放入map中
clients[ws] = true
m := Message{
Data: 0,
}
//把消息 写入通道
broadcast <- m
c.EnableRender = false //Beego不启用渲染
var s Message
for {
//接收客户端的消息
err := ws.ReadJSON(&s)
if err != nil {
log.Printf("页面可能断开啦 ws.ReadJSON error: %v", err.Error())
delete(clients, ws) //删除map中的客户端
break //结束循环
} else {
//接受消息 业务逻辑
fmt.Println("接受到从页面上反馈回来的信息 ", s)
}
}
}
func init() {
go handleMessages()
}
//广播推送消息
func handleMessages() {
for {
//读取通道中的消息
msg := <-broadcast
fmt.Println("clients len ", len(clients))
//循环map客户端
for client := range clients {
//把通道中的消息发送给客户端
err := client.WriteJSON(msg)
if err != nil {
log.Printf("client.WriteJSON error: %v", err)
client.Close() //关闭
delete(clients, client) //删除map中的客户端
}
}
}
}