如何在温文尔雅中实现服务器推送websocket?

时间:2015-10-09 05:49:59

标签: websocket f# suave

我可以写这样的东西

let echo (ws: WebSocket) =
    fun ctx -> socket {
        let loop = ref true            
        while !loop do
            let! message = Async.Choose (ws.read()) (inbox.Receive())
            match message with
            | Choice1Of2 (wsMessage) ->
                match wsMessage with
                | Ping, _, _ -> do! ws.send Pong [||] true
                | _ -> ()
            | Choice2Of2 pushMessage -> do! ws.send Text pushMessage true
    }

或者我需要2个单独的套接字循环来进行并发读写吗?

2 个答案:

答案 0 :(得分:9)

我认为你可以使用std::chrono::high_resolution_clock解决这个问题(有很多实现 - 虽然我不确定哪个是最规范的)。

也就是说,您当然可以创建两个循环 - 在Async.Choose内读取一个循环,以便您可以从Web套接字接收数据;写作可以是普通的socket { .. }块。

这样的事情可以解决问题:

async { ... }

答案 1 :(得分:2)

没有正确的Async.Choose实现(至少在这种情况下),所以我们需要两个异步循环来进行并发读写;有关详细信息,请参阅this