gpt4 book ai didi

scala - Scala Play 中的状态是如何管理的! 2.0 网络套接字?

转载 作者:行者123 更新时间:2023-12-05 01:13:53 26 4
gpt4 key购买 nike

我正在查看 https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat 中的示例

要制作 websocket Controller ,您可以编写如下内容:

def chat(username: String) = WebSocket.async[JsValue] { request  =>
ChatRoom.join(username)
}

Chatroom.join 返回 scala.concurrent.Future[(Iteratee[JsValue,_],Enumerator[JsValue])] .但是在 Play 中使用的迭代器和枚举器在哪里!框架? 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 的签名(a WebSocket 包含的函数)的签名很有启发性:

RequestHeader => (Enumerator[A], Iteratee[A, Unit]) => Unit

这是一个接受 RequestHeader 的函数, Enumerator , 和 Iteratee ,并与他们做一些事情。

因此,在 future 的某个时候,该框架将提供我们的 WebSocketRequestHeader (这应该是不言自明的),一个 Enumerator[A] (枚举器是源,在这种情况下,它们是从客户端接收到的消息)和 Iteratee[A, Unit] (迭代器是接收器,在这种情况下,这是我们发送消息返回客户端的地方)。

WebSocket.adapter的情况下,WebSocket 将连接 EnumeratorIteratee通过 Enumeratee .在 WebSocket.using的情况下,WebSocket 将连接远程 Enumerator到本地 Iteratee ,并连接删除 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 ,结合 foreach Iteratee ,虽然它是一个小 fiddle 手。或许可以理解的是,在 Play 2.1 中不推荐使用 pushee 枚举器,因为它被新的 channel 系统所取代。

关于scala - Scala Play 中的状态是如何管理的! 2.0 网络套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com