我似乎无法在Play Framework 2.1版中使用websocket通信。
我创建了一个简单的测试,只需按一下按钮就可以来回发送消息。所有代码都在下面。但除按钮外没有任何显示。
有没有人看到过这个问题,或者有人能告诉我在下面的代码中我可能做错了什么?
我使用的是最新版本的Chrome。
这是我的简单设置。
在Application.java中
public static Result index() {
return ok(index.render());
}
public static WebSocket<String> sockHandler() {
return new WebSocket<String>() {
// called when the websocket is established
public void onReady(WebSocket.In<String> in,
WebSocket.Out<String> out) {
// register a callback for processing instream events
in.onMessage(new Callback<String>() {
public void invoke(String event) {
System.out.println(event);
}
});
// write out a greeting
out.write("I'm contacting you regarding your recent websocket.");
}
};
}
在路线文件中 GET / controllers.Application.index()
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.at(path="/public", file)
GET /greeter controllers.Application.sockHandler()
在Index.Scala.html
中@main(null) {
<div class="greeting"></div>
<button class="send">Send</button>
<script type="text/javascript" charset="utf-8">
$(function() {
var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket
var sock = new WS("@routes.Application.sockHandler()")
sock.onmessage = function(event) {
$('.greeting').append(event.data)
}
$('button.send').click(function() {
sock.send("I'm sending a message now.")
});
})
</script>
}
在Main.scala.html
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
<script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
</head>
<body>
@content
</body>
答案 0 :(得分:3)
问题在于
var sock = new WS("@routes.Application.sockHandler()")
您必须以以下格式指定协议和完整网址: ws:// localhost:9000 / greeter 。
请在javascript:How to construct a WebSocket URI relative to the page URI?
中检查此问题答案 1 :(得分:3)
您可以使用Route的webSocketURL()
方法来检索可以传递给WebSocket构造函数的URL。以下是Play的websocket-chat示例代码的示例:
$(function() {
var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket
var chatSocket = new WS("@routes.Application.chat(username).webSocketURL()")
var sendMessage = function() {
chatSocket.send(JSON.stringify(
{text: $("#talk").val()}
))
$("#talk").val('')
}
// ...
因此,在您的代码中,您可以使用类似
的内容var sock = new WS("@routes.Application.sockHandler().webSocketURL()");
我个人不喜欢用JS混合内插代码,因为我认为在客户端上执行的任何代码都应该只关注客户端的状态,而不是服务器的状态(更不用说它会使脚本重构)进入外部文件不可能),所以我倾向于做这样的事情:
<div class="container app-container"
data-ws-uri="@routes.Application.WSUri.webSocketURL()">
.......
</div>
然后在我的JS中我可以做类似
的事情var sock = new WS(document.querySelector(".app-container").dataset.wsUri);
// ....