我一直在使用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中做到这一点?
答案 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 ()