前言
golang后端开发过程中遇到一些处理文件数据的接口,返回时间太长导致前端超时,就准备使用websocket来实现前后端通讯。iris官方给的websocket包里面的教程并没有涉及mvc的,改了很久都没法实现,就用了原生的websocket。前些天偶然在mvc包底下发现了websocket的范例,于是就学了下。发现教程并不能跑通,去看了github里面的反馈,https://github.com/kataras/neffos/issues/11 ,是跨域的问题,根据开发者的回复,修改了代码。
版本
go version 1.13 linux/amd64
iris版本是 11.2
运行环境是 CentOS 7
router
- 注册路由
import (
// 列几个关键的
...
gorillaWs "github.com/gorilla/websocket"
"github.com/kataras/iris/websocket"
"github.com/kataras/neffos/gorilla"
"github.com/kataras/iris"
"github.com/kataras/iris/mvc"
...
)
var (
//App : Iris服务对象
App *iris.Application
...
)
func init() {
...
App = iris.New()
...
}
func RegisterWebsocketMvc(url string, wsController interface{
}) *mvc.Application {
// 定义mvc的路由地址
wsRouter := App.Party(url)
wsApp := mvc.New(wsRouter)
// 绑定websocket的controller
wsApp.HandleWebsocket(wsController)
// 开启一个websocket
wsServer := websocket.New(
gorilla.Upgrader(gorillaWs.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true }}), wsApp)
// Upgrader 有两种
// 1. websocket.DefaultGobwasUpgrader
// 2. websocket.DefaultGorillaUpgrader
// 因为gorilla的upgrader有CheckOrigin限制,所以如果要使用gorilla, 需要使用如下
// gorilla.Upgrader(gorillaWs.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }})
wsApp.Router.Get("", websocket.Handler(wsServer))
return wsApp
}
#service
- 在service层中注册并使用websocket
type wsController struct {
*websocket.NSConn `stateless:"true"`
Namespace string
}
// 使用channel来实现协程通信
var msgToWS = make(chan string)
var stopChan = make(chan bool)
func init() {