Играть! Фреймворк Websockets с Chrome 17 - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь настроить простой сервер Websockets с помощью Play! рамки (1.2.4). Все, что должно произойти прямо сейчас - клиент должен подключиться, получить сообщение «Hello User», затем сокет должен закрыться. Я получаю разные результаты в разных браузерах: Safari работает как положено; Chrome 17 вызывает ошибку:

play.exceptions.JavaExecutionException: The outbound channel is closed
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
at play.mvc.WebSocketInvoker.invoke(WebSocketInvoker.java:28)
at play.server.PlayHandler$WebSocketInvocation.execute(PlayHandler.java:1332)
...

Вот код на стороне сервера:

package controllers;

import play.*;
import play.mvc.*;
import play.mvc.Http.WebSocketClose;
import play.mvc.Http.WebSocketEvent;
import play.mvc.Http.WebSocketFrame;

import java.util.*;

import models.*;
import play.data.validation.*;


public class Application extends Controller {

    public static void index() {
        render();
    }

    public static class WebSocket extends WebSocketController {
        public static void hello(String name) {
            outbound.send("Hello %s!", name);
        }
    }
}

/ ws направляется в Application.WebSocket.hello. JavaScript на стороне клиента:

window.onload = function() {
    document.getElementById('sendbutton')
        .addEventListener('click', sendMessage, false);
    document.getElementById('connectbutton')
        .addEventListener('click', connect, false);
    document.getElementById('disconnectbutton')
        .addEventListener('click', disconnect, false);
}

function writeStatus(message) {
    var html = document.createElement("div");
    html.setAttribute('class', 'message');
    html.innerHTML = message;
    document.getElementById("status").appendChild(html);
}

function connect() {

ws = new WebSocket("ws://localhost:9000/ws?name=User");

    ws.onopen = function(evt) { 
        writeStatus("connected");
    }

    ws.onclose = function(evt) {
        writeStatus("disconnected");
    }

    ws.onmessage = function(evt) {
        writeStatus("response: " + evt.data);
    }

    ws.onerror = function(evt) {
        writeStatus("error: " + evt.data);
    }
}

function disconnect() {
    ws.close();
}

function sendMessage() {
    ws.send(document.getElementById('messagefield').value);
}

Ответ на рукопожатие неправильный? Как я могу это исправить?

1 Ответ

2 голосов
/ 20 февраля 2012

Попробуйте получить последнюю версию из ветки master. 1.2.4 был выпущен до того, как была выпущена последняя версия протокола websockets. В результате, с тех пор это стало движущейся целью, так как браузеры добавили более новые версии, а веб-серверы пытались наверстать упущенное.

Теперь он должен быть стабильным, поскольку он стал стандартом от W3C, а поддержка Websocket напрямую от Netty, а не от самой Play.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...