限制与服务器的连接

Limit connections to server

我想限制与 websocket 服务器的连接。即到 1.新客户端把老客户端踢出去

这有点代表了我想做的事情。获取 messages 中的内容并通过 websocket 发送。如果另一个客户端连接或浏览器刷新(这应该关闭旧连接,但由于某种原因没有关闭)突然有 2 个连接并且只有第二个消息在新客户端接收。

我为此使用了 snap 框架。

createServer = forkIO $ httpServe defaultConfig app

app = route [("/", runWebSocketsSnap handler)]

handler pending = do
    connection <- acceptRequest pending
    loop connection

loop connection = do
    msg <- takeMVar messages
    sendTextData connection msg

{-# NOINLINE messages #-}
messages = unsafePerformIO newEmptyMVar

sendMessage = putMVar messages

我在这里看到两个不同的问题:

  1. 如何限制连接数,最多同时有N个客户端;

  2. 确保旧连接不会在浏览器刷新后永远存在;

我想你是说#2。在这种情况下,您应该检查连接是否有效。最好的方法是定期 ping 客户端,例如使用 forkPingThread.

如果你真的需要#1,那么你应该在其中建立与当前客户端的ThreadId共享的MVar。当新客户端连接时,只有 kill 旧客户端。