进阶 www.iris-go.com 2026-10-20 02:39:14 · 19 阅读

第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 绑定到控制器方法。

  1. 通过声明 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"),具体取决于你的需求。

  1. 将 MVC 应用的目标初始化到一个 WebSocket 端点,操作方式与普通 HTTP 路由的 Controller 类似。
import (
    // [...]
    "github.com/kataras/iris/v12/mvc"
)
// [app := iris.New...]

mvcApp := mvc.New(app.Party("/websocket_endpoint"))
  1. 注册依赖项(如有)。
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))

评论 (0)