NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# [Websockets](https://github.com/kataras/iris/wiki/Websockets#websockets) [WebSocket](https://wikipedia.org/wiki/WebSocket) 是一种协议,可通过 TCP 连接启用双向持久通信通道。它用于聊天,股票行情,游戏等应用程序,你需要在Web 应用程序中具有实时功能的任何地方。 需要直接使用套接字连接时,请使用 WebSockets 。例如,你可能需要实时游戏的最佳性能。 首先,请阅读 **[kataras/neffos wiki](https://github.com/kataras/neffos/wiki)** 以掌握为 net/http 和 Iris 构建的新 websocket 库。 它是 Iris 预先安装的,但是你可以通过执行以下 shell 命令单独安装它。 ```source-shell $ go get github.com/kataras/neffos@latest ``` 继续阅读如何将 neffos websocket 服务器注册到 Iris 应用程序中。 可在以下位置找到使用 websockets的综合示例列表:<https://github.com/kataras/iris/tree/master/_examples/websocket>. * * * * *  [iris/websocket](https://github.com/kataras/iris/tree/master/websocket) 子软件包 包含(仅)适用于 [neffos websocket framework](https://github.com/kataras/neffos) 之一的 Iris 特定迁移和辅助方法。 例如,要访问请求的 `Context` 你可以从事件消息处理程序/回调内部调用 `websocket.GetContext(Conn)` : ```source-go // GetContext 从一个 Websocket 连接返回 Iris 的 Context 。 func GetContext(c *neffos.Conn) Context ``` 使用  `websocket.Handler` 函数 注册一个 websocket `neffos.Server`  到一个路由: ```source-go // IDGenerator是用于新连接 iris 特定的 IDGenerator 。 type IDGenerator func(Context) string // Handler 返回一个要在 Iris 应用程序的路由中使用的 Iris 处理程序。 // 接受 neffos websocket 服务器作为其第一个输入参数 //,也可以选择使用 iris 特定于的 `IDGenerator` 作为它的第二个。 func Handler(s *neffos.Server, IDGenerator ...IDGenerator) Handler ``` **用法** ```source-go import ( "github.com/kataras/neffos" "github.com/kataras/iris/v12/websocket" ) // [...] onChat := func(ns *neffos.NSConn, msg neffos.Message) error { ctx := websocket.GetContext(ns.Conn) // [...] return nil } app := iris.New() ws := neffos.New(websocket.DefaultGorillaUpgrader, neffos.Namespaces{ "default": neffos.Events { "chat": onChat, }, }) app.Get("/websocket_endpoint", websocket.Handler(ws)) ``` ## [Websocket 控制器](https://github.com/kataras/iris/wiki/Websockets#websocket-controller) Iris 具有通过一个 Go 结构注册 websocket 事件的简单方法。 websocket 控制器是 [MVC](https://github.com/kataras/iris/wiki/MVC) 功能的一部分。 Iris 具有自己的 `iris/mvc/Application.HandleWebsocket(v interface{}) *neffos.Struct` 以在现有 Iris 的 MVC 应用程序中注册控制器(为请求值和静态服务提供功能齐全的依赖项注入容器)。 ```source-go // HandleWebsocket 处理 Websocket 特定的控制器。 // 它的导出方法是事件。 // 如果存在 “名称空间” 字段或方法,则会设置名称空间, // 否则此控制器将使用空名称空间。 // // 请注意,一个websocket控制器已注册并 // 连接到名称空间的连接 // ,并且无法在该状态下发送HTTP响应。 // 但是,所有静态和动态依赖项的行为均符合预期。 func (*mvc.Application) HandleWebsocket(controller interface{}) *neffos.Struct ``` 让我们看一个使用示例, 我们想将 `OnNamespaceConnected`,`OnNamespaceDisconnect` 内置事件和自定义的 `"OnChat"` 事件与控制器的方法绑定。 **1.** 我们通过将 NSConn 类型字段声明为  `stateless` 来创建控制器并编写所需的方法。 ```source-go 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`struct字段,以使用该字段将控制器的方法注册为该命名空间的事件,或者, 你可以创建 `Namespace() string { return "default" }`  的一个控制器方法或者使用 `HandleWebsocket` 的返回值到 `.SetNamespace("default")`,这取决于你。 **2.** 我们将 MVC 应用程序目标初始化为 websocket端点,就像以前使用常规 HTTP 控制器处理 HTTP 路由一样。 ```source-go import ( // [...] "github.com/kataras/iris/v12/mvc" ) // [app := iris.New...] mvcApp := mvc.New(app.Party("/websocket_endpoint")) ``` **3.** 我们注册了我们的依赖项(如果有的话)。 ```source-go mvcApp.Register( &prefixedLogger{prefix: "DEV"}, ) ``` **4.** 我们注册了一个或多个 websocket 控制器,每个 websocket 控制器都映射到一个名称空间 (一个就足够了,因为在大多数情况下,你不需要更多的名称,但这取决于你应用的需求)。 ```source-go mvcApp.HandleWebsocket(&websocketController{Namespace: "default"}) ``` **5.** 接下来,我们将 mvc 应用程序作为连接处理程序映射到 websocket 服务器 (你以通过 `neffos.JoinConnHandlers(mvcApp1, mvcApp2)` 为每个 websocket 服务器使用多个mvc应用程序)。 ```source-go websocketServer := neffos.New(websocket.DefaultGorillaUpgrader, mvcApp) ``` **6.** 最后一步是通过常规 `.Get` 方法将该服务器注册到我们的端点。 ```source-go mvcApp.Router.Get("/", websocket.Handler(websocketServer)) ``` [TOC] [TOC]