测试ws
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
@@ -18,6 +21,20 @@ type EventController struct {
|
|||||||
beego.Controller
|
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 查询操作日志事件明细
|
// @Title 查询操作日志事件明细
|
||||||
// @Description 查询操作日志事件明细
|
// @Description 查询操作日志事件明细
|
||||||
// @Param token header string true "认证token"
|
// @Param token header string true "认证token"
|
||||||
@@ -92,15 +109,66 @@ func (c *EventController) GetWeixinUnlimited() {
|
|||||||
// @Failure 200 {object} controllers.CallResult
|
// @Failure 200 {object} controllers.CallResult
|
||||||
// @router /TestWebsocket [get]
|
// @router /TestWebsocket [get]
|
||||||
func (c *EventController) TestWebsocket() {
|
func (c *EventController) TestWebsocket() {
|
||||||
c.callTestWebsocket(func(params *tEventTestWebsocketParams) (retVal interface{}, errCode string, err error) {
|
// 解决跨域问题(微信小程序)
|
||||||
var upgrader = websocket.Upgrader{}
|
upgrader.CheckOrigin = func(r *http.Request) bool {
|
||||||
conn, _ := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
|
return true
|
||||||
go func(conn *websocket.Conn) {
|
}
|
||||||
for {
|
//升级将HTTP服务器连接升级到WebSocket协议。
|
||||||
mType, msg, _ := conn.ReadMessage()
|
//responseHeader包含在对客户端升级的响应中
|
||||||
conn.WriteMessage(mType, msg)
|
//请求。使用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中的客户端
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}(conn)
|
|
||||||
return retVal, "", err
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user