2

我一直在使用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 中如何做到这一点?

4

2 回答 2

4

websockets-snap包有一个功能:

runWebSocketsSnap :: Protocol p => (Request -> WebSockets p()) -> Snap()

这应该让您可以在应用程序的几乎任何地方使用 websocket。这是一个简单的例子:

main = quickHttpServe $ route [ ("hello", writeText "hello world")
                              , ("websocket", runWebSocketsSnap ...)
                              ]
于 2012-10-09T01:24:24.690 回答
3

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 ()
于 2012-10-05T20:22:24.103 回答