背景:
- 将 WebSockets 与 JavaScript + Play 一起使用!框架(2.2)。
- 可以在 Chrome 中正常发送和接收数据。
- 只能在 Firefox 中接收数据(来自服务器),因为 send() 不会触发任何回调。
除了发送问题之外,仅在 Firefox中,页面的选项卡总是卡在“正在连接”上,而微调器继续旋转(见图 1)。
行为不端的浏览器: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0)( Firefox 24.0 )
(图 1 . 页面加载并显示数据后的 Firefox 选项卡)
每当我刷新网页时,我都会收到以下错误,这归因于我确定的持续页面加载行为。
The connection to ws://localhost:9000/ was interrupted while the page was loading.
整个 JavaScript 代码:
$(function() {
var chatSocket = new WebSocket("@routes.Application.getMetaData().webSocketURL(request)");
var sendMessage = function() {
chatSocket.send(JSON.stringify({
id: "unique",
name: "a name",
age: 22
}));
}
var receiveEvent = function(event) {
var data = JSON.parse(event.data)
document.write(data.age);
document.write(data.name);
document.write(data.message);
document.write("\n");
sendMessage();
chatSocket.close();
}
chatSocket.onmessage = receiveEvent
})
现在在过去,我一直在尝试使用MozWebSocket
而不是 standard WebSocket
,但是使用该模块我没有在屏幕上渲染任何内容,因此除非我错过了一个角度,否则WebSocket
最好使用它。
相关游戏!堵塞:
public static WebSocket<JsonNode> getMetaData() {
return new WebSocket<JsonNode>() {
// Called when the Websocket Handshake is done.
public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out) {
// For each event received on the socket,
in.onMessage(new Callback<JsonNode>() {
@Override
public void invoke(JsonNode jsonNode) {
System.out.println("Message Incoming!");
System.out.println(jsonNode.get("id"));
System.out.println(jsonNode.get("name"));
System.out.println(jsonNode.get("age"));
}
});
// When the socket is closed.
in.onClose(new Callback0() {
public void invoke() {
System.out.println("Disconnected");
}
});
ObjectNode node = Json.newObject();
node.put("message", "hello");
node.put("name", "client");
node.put("age", 1);
out.write(node);
//same result commented/uncommented
out.close();
}
};
}
所以在Chrome中,流程是:
- 文档.write(...)
- “消息来了!”
- ... JSON 属性
- “断开连接”
但在Firefox中,流程是:
- 文档.write(...)
- “断开连接”
任何诊断这些问题的帮助将不胜感激。我无意支持 IE,但让 Mozilla 和 Chrome 都能正常工作会很棒。
其他 JavaScript 警告:
下面是一个警告,我偶尔会在 Firefox 的控制台中看到“ws”协议是罪魁祸首。我不知道它与我的问题有什么关系。
Use of getPreventDefault() is deprecated. Use defaultPrevented instead.