diff --git a/controllers/event.go b/controllers/event.go index d7b0ae459..337c161cb 100644 --- a/controllers/event.go +++ b/controllers/event.go @@ -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中的客户端 + } + } + } }