如何使用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?