加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala Play中管理国家! 2.0 Websockets?

发布时间:2020-12-16 10:03:45 所属栏目:安全 来源:网络整理
导读:我正在看 https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat的例子 要制作一个websocket控制器,你可以这样写: def chat(username: String) = WebSocket.async[JsValue] { request = ChatRoom.join(username)} Chatroom.jo
我正在看 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中被弃用,因为它被新的频道系统所取代.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读