如何在Haskell的同一端口上运行websockets服务器和普通的HTTP Web服务器?

时间:2012-10-05 20:00:23

标签: haskell websocket socket.io

我一直在使用Network.WebSockets编写websocket服务器。

您启动了一个runServer的websockets服务器,如下所示:

app :: Request -> WebSockets Hybi00 ()
app _ = app1
main :: IO ()
main = runServer "0.0.0.0" 8000 app

但我真的希望websockets服务器与普通的Snap网络服务器一起用完80端口。

Node.js能够使用Socket.io执行此操作(请参阅左侧示例中的http://socket.io/#how-to-use)。

这是一个实现类似功能的Ruby库:https://github.com/simulacre/sinatra-websocket

如何在Haskell中做到这一点?

2 个答案:

答案 0 :(得分:4)

websockets-snap包有一个功能:

runWebSocketsSnap :: Protocol p => (请求 - > WebSockets p()) - > Snap()

这应该允许您从应用程序的几乎任何位置使用websockets。这是一个简单的例子:

main = quickHttpServe $ route [ ("hello", writeText "hello world")
                              , ("websocket", runWebSocketsSnap ...)
                              ]

答案 1 :(得分:3)

Warp提供了用于向WebSockets请求提升常规HTTP请求的挂钩。我不知道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 ()