Play! Framework Websockets with Chrome 17



我正在尝试用Play设置一个简单的Websockets服务器!框架(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);
}

握手响应是否错误?我该怎么解决这个问题?

尝试从master分支获取最新版本。1.2.4是在最新版本的websockets协议发布之前发布的。因此,从那以后,这一直是一个移动的目标,因为浏览器添加了新版本,网络服务器也试图跟上。

现在它应该是稳定的,因为它已经成为W3C的标准,并且Websocket支持直接来自Netty,而不是Play本身。

相关内容

  • 没有找到相关文章

最新更新