0

背景:

  • 将 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中,流程是:

  1. 文档.write(...)
  2. “消息来了!”
  3. ... JSON 属性
  4. “断开连接”

但在Firefox中,流程是:

  1. 文档.write(...)
  2. “断开连接”

任何诊断这些问题的帮助将不胜感激。我无意支持 IE,但让 Mozilla 和 Chrome 都能正常工作会很棒。

其他 JavaScript 警告:

下面是一个警告,我偶尔会在 Firefox 的控制台中看到“ws”协议是罪魁祸首。我不知道它与我的问题有什么关系。

Use of getPreventDefault() is deprecated.  Use defaultPrevented instead.
4

1 回答 1

3

document.write()在加载文档后调用,这意味着document.open()它依次替换文档并卸载旧文档并中止诸如超时或 websockets 之类的内容。

使用其他东西document.write(),你应该没问题。

于 2013-10-24T23:40:16.497 回答