如何在Scala Play中管理国家! 2.0 Websockets?
我正在看
https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat的例子
要制作一个websocket控制器,你可以这样写: def chat(username: String) = WebSocket.async[JsValue] { request => ChatRoom.join(username) } Chatroom.join返回一个scala.concurrent.Future [(Iteratee [JsValue,_],Enumerator [JsValue])].但是在Play中使用的iteratee和枚举器在哪里!框架? WebSocket类(WebSocket.scala)似乎忽略了输入: case class WebSocket[A](f: RequestHeader => (Enumerator[A],Iteratee[A,Unit]) => Unit) (implicit val frameFormatter: WebSocket.FrameFormatter[A]) extends Handler { type FRAMES_TYPE = A /** * Returns itself,for better support in the routes file. * * @return itself */ def apply() = this } 怎么玩!在消耗输入时管理iteratee的变化状态? 解决方法
值得注意的是,WebSocket本身只是一个愚蠢的容器.魔术发生在play.core.server.netty中的各个类中.
要了解这种魔法是什么,查看f的签名(WebSocket包含的函数)是有益的: RequestHeader => (Enumerator[A],Unit]) => Unit 这是一个接收RequestHeader,Enumerator和Iteratee的函数,并对它们执行某些操作. 因此,在未来的某个时刻,框架将为我们的WebSocket提供一个RequestHeader(应该是自解释的),一个枚举器[A](枚举器是源,在这种情况下,这些是从客户端接收的消息)和Iteratee [A,Unit](Iteratees是接收器,这是我们发送消息以返回客户端的地方). 对于WebSocket.adapter,WebSocket将通过枚举器将Enumerator连接到Iteratee.对于WebSocket.using,WebSocket将远程Enumerator连接到本地Iteratee,并将remove Iteratee连接到本地Enumerator. 而不是直接定义WebSocket,使用WebSocket对象中的一种便捷方法可能更容易.以下代码将回显之前收到的消息: def mySocket = WebSocket.adapter {implicit req => var lastMessage = "No previous message" Enumeratee.map[String] {msg => val response = lastMessage lastMessage = msg response } } 请注意,此代码几乎肯定存在线程安全问题 – 在Scala中,您应该尽可能避免使用可变状态,或者如果没有则使用actor或类似代码. 或者,尝试使用WebSocket.using,并查看一个pushee Enumerator,与forete Iteratee一起使用,尽管它有点小提琴手.也许可以理解,pushee枚举器在Play 2.1中被弃用,因为它被新的频道系统所取代. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- twitter-bootstrap – Bootstrap 3 glyphicons无法正确显示
- Bootstrap 4 beta 3使用angular-cli抛出错误
- 安装下载yum,组建FTP服务器
- 升级Angular项目后,“Uncaught TypeError:Object.setProto
- angularjs – 从角度(时区)到服务器(utc)的日期,然后是utc到
- at91sam9260 bootstrap 3.2移植
- angularjs – 基于ui-router的查询重新加载查询参数更改
- twitter-bootstrap – twitter bootstrap形式内联拉伸
- 批量安装nagios客户端
- winform autoupdate