测试ws
This commit is contained in:
@@ -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中的客户端
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user