Scala 基本播放框架路由和web套接字示例

Scala 基本播放框架路由和web套接字示例,scala,playframework,websocket,playframework-2.0,Scala,Playframework,Websocket,Playframework 2.0,我正在尝试学习如何在Play2.1中使用web套接字,但我在让web套接字URL与我的应用程序的路由配置配合使用时遇到了问题。我从一个新的Play应用程序和 这是我的conf/routes: # Home page GET / controllers.Application.index # Websocket test site GET /wstest controllers.Application.wstest 然后,我将wstest函数

我正在尝试学习如何在Play2.1中使用web套接字,但我在让web套接字URL与我的应用程序的路由配置配合使用时遇到了问题。我从一个新的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
ws://localhost:9000/wstest
(使用处的示例代码)访问websocket。我在看Play框架附带的
sample/scala/websocket chat
应用程序,它使用路由配置文件引用websocket,如下所示:

var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket
var chatSocket = new WS("@routes.Application.chat(username).webSocketURL()")
我尝试用
@routes.Application.wstest.webSocketURL()
@routes.Application.wstest
替换我的websocket URL。第一个没有编译。第二个可以编译,但客户端和服务器不交换任何消息

如何使用播放路由配置访问此websocket?我做错了什么


编辑

下面是我的编译错误的屏幕截图,“此处找不到任何HTTP请求头”:


如果没有编译器错误,很难猜出问题出在哪里


由于隐式请求,您必须使用parens,即
@routes.Application.wstest().webSocketURL()
,或者您的作用域中没有webSocketURL调用所需的隐式请求。

Marius说得对,作用域中没有隐式请求。以下是如何将其纳入范围:

更新控制器中的
索引
功能:

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)
@主(信息){
var输出;
函数init(){
输出=document.getElementById(“输出”);
testWebSocket();
}
函数testWebSocket(){
websocket=newWebSocket(@routes.Application.wstest.webSocketURL());
.
.
.

现在,
RequestHeader
已在范围内。

感谢您的提示。我添加了一个编译错误的屏幕截图。是的,在这种情况下,模板中缺少隐式请求,只需添加另一个带有
(隐式请求:RequestHeader)
的参数列表即可。