# [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]
