第20章 Iris WebSocket 控制器
Websocket Controller
Iris 提供了一种简单的机制,通过 Go 结构体注册 WebSocket 事件。WebSocket 控制器是 MVC 功能的一部分。Iris 拥有专门的 iris/mvc/Application.HandleWebsocket(v interface{}) *neffos.Struct 方法,用于在现有的 Iris MVC 应用中注册控制器(该方法提供完整的依赖注入容器,支持请求值和静态服务)。
// HandleWebsocket 处理特定的 WebSocket 控制器。
// 其导出的方法即为事件。
// 如果存在 "Namespace" 字段或方法,则会设置该命名空间,
// 否则此控制器将使用空命名空间。
//
// 注意:WebSocket 控制器是在连接到某个命名空间的连接下注册并运行的,
// 在该状态下无法发送 HTTP 响应。
// 但所有静态和动态依赖项的行为符合预期。
func (*mvc.Application) HandleWebsocket(controller interface{}) *neffos.Struct
下面是一个使用示例,我们希望将内置事件 OnNamespaceConnected、OnNamespaceDisconnect 以及自定义事件 OnChat 绑定到控制器方法。
- 通过声明
NSConn类型的无状态字段并编写所需方法,创建控制器。
type websocketController struct {
*neffos.NSConn `stateless:"true"`
Namespace string
Logger MyLoggerInterface
}
func (c *websocketController) OnNamespaceConnected(msg neffos.Message) error {
return nil
}
func (c *websocketController) OnNamespaceDisconnect(msg neffos.Message) error {
return nil
}
func (c *websocketController) OnChat(msg neffos.Message) error {
return nil
}
Iris 足够智能,能够捕获 Namespace string 结构体字段,用它将控制器的方法注册为该命名空间的事件。你也可以创建 Namespace() string { return "default" } 方法,或者使用 HandleWebsocket 的返回值调用 .SetNamespace("default"),具体取决于你的需求。
- 将 MVC 应用的目标初始化到一个 WebSocket 端点,操作方式与普通 HTTP 路由的 Controller 类似。
import (
// [...]
"github.com/kataras/iris/v12/mvc"
)
// [app := iris.New...]
mvcApp := mvc.New(app.Party("/websocket_endpoint"))
- 注册依赖项(如有)。
mvcApp.Register(
&prefixedLogger{prefix: "DEV"},
)
4. 我们注册一个或多个 websocket controller,每个 websocket controller 对应一个 namespace(通常一个就够用了,因为大多数情况下你不需要更多,但具体还是取决于你的应用需求)。
gomvcApp.HandleWebsocket(&websocketController{Namespace: "default"})
5. 接下来,我们把 mvc 应用映射为 websocket server 的连接处理器(通过 neffos.JoinConnHandlers(mvcApp1, mvcApp2),一个 websocket server 可以使用多个 mvc 应用)。
gowebsocketServer := neffos.New(websocket.DefaultGorillaUpgrader, mvcApp)
6. 最后一步,就是通过普通的 .Get 方法把这个 server 注册到我们的 endpoint 上。
gomvcApp.Router.Get("/", websocket.Handler(websocketServer))