限制与服务器的连接
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
我在这里看到两个不同的问题:
如何限制连接数,最多同时有N个客户端;
确保旧连接不会在浏览器刷新后永远存在;
我想你是说#2。在这种情况下,您应该检查连接是否有效。最好的方法是定期 ping 客户端,例如使用 forkPingThread.
如果你真的需要#1,那么你应该在其中建立与当前客户端的ThreadId
共享的MVar
。当新客户端连接时,只有 kill 旧客户端。
我想限制与 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
我在这里看到两个不同的问题:
如何限制连接数,最多同时有N个客户端;
确保旧连接不会在浏览器刷新后永远存在;
我想你是说#2。在这种情况下,您应该检查连接是否有效。最好的方法是定期 ping 客户端,例如使用 forkPingThread.
如果你真的需要#1,那么你应该在其中建立与当前客户端的ThreadId
共享的MVar
。当新客户端连接时,只有 kill 旧客户端。