如何使用Haskell在同一端口上运行websockets服务器和普通HTTP Web服务器?
我一直在用 使用如何使用Haskell在同一端口上运行websockets服务器和普通HTTP Web服务器?,haskell,websocket,socket.io,Haskell,Websocket,Socket.io,我一直在用 使用runServer启动websockets服务器,如下所示: app :: Request -> WebSockets Hybi00 () app _ = app1 main :: IO () main = runServer "0.0.0.0" 8000 app 但我真的希望websockets服务器与普通快照Web服务器一起用完端口80 Node.js能够通过Socket.io实现这一点(请参见左侧示例) 下面是一个Ruby库,它实现了类似的功能: 在Haskell中
runServer
启动websockets服务器,如下所示:
app :: Request -> WebSockets Hybi00 ()
app _ = app1
main :: IO ()
main = runServer "0.0.0.0" 8000 app
但我真的希望websockets服务器与普通快照Web服务器一起用完端口80
Node.js能够通过Socket.io实现这一点(请参见左侧示例)
下面是一个Ruby库,它实现了类似的功能:
在Haskell中如何实现这一点?Warp提供了用于将常规HTTP请求升级为WebSockets请求的钩子。我不知道Snap的首选服务器是什么。。。这是我用于Warp/WAI应用程序的模式:
httpApp :: Application
httpApp req = ...
wsApp :: WebSockets.Request -> WebSockets Hybi10 ()
wsApp req = do
-- check if the request should be handled
if shouldHandleRequest
then do
acceptRequest
...
else rejectRequest ...
main :: IO ()
main = do
let settings = Warp.defaultSettings
{settingsIntercept = WebSockets.intercept wsApp}
Warp.runSettings settings httpApp
return ()
该软件包具有以下功能:
runWebSocketsSnap::协议p=>(请求->WebSockets p())->快照()
这应该允许您使用应用程序中几乎任何位置的WebSocket。下面是一个简单的例子:
main = quickHttpServe $ route [ ("hello", writeText "hello world")
, ("websocket", runWebSocketsSnap ...)
]
该包可能就是您正在寻找的。您将如何执行快照路由以插入websocket处理程序?这确实有效,但我注意到websocket连接在大约一分钟后一直断开。我尝试修补defaultTimeout设置,但没有效果…尝试使用snap core的我也尝试过,但websocket仍然会在大约一分钟内被杀死,而不管设置如何。@dan请在客户端连接后立即尝试使用
WS.startPingThread 30
。这样,您就可以确保websocket上有周期性的活动,而snap不应该以这种方式杀死它。你的意思当然是spokingthread
。我现在正在尝试,但它要求我将WS-loop使用的WS-protocol从Hybi00更改为Hybi10。我想没有办法在Hybi00(最广泛支持的)上pingThread?