Suave 中的 Websockets

Websockets in Suave

我一直在研究将 websockets 与 Suave 网络服务器一起使用。不幸的是,它没有很好的记录,我所找到的只是:https://github.com/SuaveIO/suave/tree/master/examples/WebSocket

但是,这只显示了 websocket 响应发出请求的客户端,我基本上想让套接字响应所有连接的客户端。类似聊天服务器的东西。

我过去使用过 SignalR,但我宁愿避免使用它。

那么,我将如何让 Suave 服务器向所有连接的 websocket 客户端发送数据?

Suave 不提供开箱即用的任何东西,但是您可以轻松地扩展示例来实现这一点。

传递给handShake函数的socket handlerws可以向外传递client信息,可以围绕它构建send/broadcastAPI

ws函数可以这样修改,例如

let ws onConnect onDisconnect (webSocket: WebSocket) (context: HttpContext) =
    let loop () = (* the socket logic stays the same *)

    socket {
        onConnect webSocket context
        try
            do! loop ()
        finally
            onDisconnect context
    }

然后由您将 onConnectonDisconnect 句柄注入 register/unregister 客户端。

我使用 MailboxProcessor 来序列化 Connect/Disconnect/Send 操作,或者使用 Reactive Extensions 或像 ConcurrentDictionary...[=18= 这样的共享可变并发存储很容易]