我正在尝试学习如何在Play 2.1中使用Web套接字,而我无法使用Web套接字URL来使用我的应用程序的路由配置。我开始使用新的Play应用程序和Play framework documentation on websockets。
这是我的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)
}
}
但是,到目前为止,我只能使用网址ws://localhost:9000/wstest
访问websocket(使用websocket.org/echo.html处的示例代码)。我正在查看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网址。第一个不编译。第二个编译,但客户端和服务器不交换任何消息。
如何使用Play路由配置访问此websocket?我在这里做错了什么?
修改
以下是我的编译错误的屏幕截图,“此处找不到任何HTTP请求标头”:
答案 0 :(得分:6)
如果没有编译器错误,很难猜出可能是什么问题。
由于隐式请求,您必须使用parens,即@routes.Application.wstest().webSocketURL()
,或者您在webSocketURL调用所需的范围内没有隐式请求。
答案 1 :(得分:3)
马吕斯是对的,范围内没有隐含的请求。以下是如何将其纳入范围:
更新控制器中的index
功能:
def index = Action { implicit request =>
Ok(views.html.index("Websocket Test"))
}
将请求作为curried参数添加到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
在范围内。