7

我正在尝试学习如何在 Play 2.1 中使用 Web 套接字,但我无法让 Web 套接字 URL 与我的应用程序的路由配置一起使用。我从一个新的 Play 应用程序和websockets 上的 Play 框架文档开始

这是我的conf/routes

# Home page
GET   /               controllers.Application.index

# Websocket test site
GET   /wstest         controllers.Application.wstest

然后我将该wstest函数添加到我的控制器类中:

object Application extends Controller {

  def index = Action {
    Ok(views.html.index("Websocket Test"))
  }

  def wstest = WebSocket.using[String] { request =>
    // Log events to the console
    val in = Iteratee.foreach[String](println).mapDone { _ =>
      Logger.info("Disconnected")
    }

    // Send a single 'Hello!' message
    val out = Enumerator("Hello!")

    (in, out)
  }
}

但是,到目前为止,我只能使用 URL 访问 websocket (使用websocket.org/echo.htmlws://localhost:9000/wstest上 的示例代码)。我正在查看Play 框架附带的应用程序,它使用路由配置文件来引用 websocket,如下所示: sample/scala/websocket-chat

var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket
var chatSocket = new WS("@routes.Application.chat(username).webSocketURL()")

@routes.Application.wstest.webSocketURL()我尝试用and替换我的 websocket URL @routes.Application.wstest。第一个没有编译。第二个编译,但客户端和服务器不交换任何消息。

如何使用我的 Play 路由配置来访问这个 websocket?我在这里做错了什么?


编辑

这是我的编译错误“在这里找不到任何 HTTP 请求标头”的屏幕截图:

编译错误

4

2 回答 2

6

如果没有编译器错误,很难猜测可能是什么问题。

由于隐式请求,您必须使用括号,即@routes.Application.wstest().webSocketURL(),或者您在 webSocketURL 调用所需的范围内没有隐式请求。

于 2013-05-17T18:07:14.720 回答
3

马吕斯是对的,范围内没有隐含的请求。以下是如何将其纳入范围:

更新index控制器中的函数:

def index = Action { implicit request =>
  Ok(views.html.index("Websocket Test"))
}

将请求作为咖喱参数添加到index.scala.html

@(message: String)(implicit request: RequestHeader)

@main(message) {

<script>
    var output;
    function init() {
        output = document.getElementById("output");
        testWebSocket();
    }
    function testWebSocket() {
        websocket = new WebSocket("@routes.Application.wstest.webSocketURL()");
    .
    .
    .

现在RequestHeader在范围内。

于 2013-05-17T18:47:57.087 回答