Skip to content

Latest commit

 

History

History
146 lines (105 loc) · 4.97 KB

Websockets.md

File metadata and controls

146 lines (105 loc) · 4.97 KB

Websockets

Websocket协议支持TCP连接中双向持久通信通道, 它可用于聊天、炒股、游戏等任何web应用中的实时功能

当您需要直接使用套接字连接的时候, 使用WebSockets, 比如, 您可能需要游戏实时具有最佳功能

首先, 阅读kataras/neffos wiki来掌握为net/http和Iris构建的新型websocket库

它可通过Iris预安装, 然而, 您可以通过以下shell命令来单独安装

go get github.com/kataras/neffos@latest

继续阅读如何将neffos websocket服务器注册到Iris应用中

使用websockets的完整例子可以在这里找到

iris/websocket子包仅包含特定于Iris的迁移和neffos websocket framework的帮助

例如, 要访问请求的 Context , 您可以调用内置于消息处理器/回调器的 websocket.GetContext(Conn) :

// GetContext从websocket的连接中返回Iris Context.
func GetContext(c *neffos.Conn) Context

要注册一个websocket neffos.Server 到一个路由, 可使用 websocket.Handler 功能

// IDGenerator是一个特定于Iris、服务新型连接的ID生成器
type IDGenerator func(Context) string

// Handler返回一个为Iris路由服务的Iris处理程序
// 接收neffos websocket服务器作为它的第一个输入参数, 
// 并且可选择一个特定于Iris的ID生成器作为第二个参数
func Handler(s *neffos.Server, IDGenerator ...IDGenerator) Handler

用法:

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控制器

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

咱们看一个使用实例, 我们想把 OnNamespaceConnectedOnNamespaceDisconnect 内置事件与自定义的 "OnChat" 事件与控制器方法绑定

1.我们通过声明NSConn类型字段为 stateless 来创建控制器, 并编写我们所需要的方法

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") , 取决于您

2.我们将MVC应用的目标初始化为websocket结点, 就像过去对HTTP路由的常规HTTP控制器那样

import (
    // [...]
    "github.com/kataras/iris/v12/mvc"
)
// [app := iris.New...]

mvcApp := mvc.New(app.Party("/websocket_endpoint"))

3.我们依赖注册项(如果有的话)

mvcApp.Register(
    &prefixedLogger{prefix: "DEV"},
)

4.我们注册一个或多个websocket控制器, 每个websocket控制器映射到一个命名空间(一个就够了, 大多数情况下你不需要更多, 但这取决于你的应用需要和要求)

mvcApp.HandleWebsocket(&websocketController{Namespace: "default"})

接下来, 我们继续将mvc应用映射为websocket服务器的连接处理程序(你可以调用 neffos.JoinConnHandlers(mvcApp1, mvcApp2) , 使得每一个websocket服务器不止一个MVC应用)

websocketServer := neffos.New(websocket.DefaultGorillaUpgrader, mvcApp)

6.最后一步是通过一个普通的 .Get 方法将该服务器注册到我们的结点

mvcApp.Router.Get("/", websocket.Handler(websocketServer))