java - 如何在 Play Framework 中使用 WebSockets?

标签 java javascript playframework websocket

我已经从 GitHub 下载了 Play Framework 并编译了它。现在我想使用 WebSockets 并制作了一个类似于 Using WebSockets 上的 JavaScript 客户端和 WebSocket Controller 。 ,但它不起作用。我可以打开 WebSocket,但 Controller 没有收到我发送给它的任何消息。而且我无法使用 ws.close(); 关闭 WebSocket,但是如果我在浏览器中更新我的网页,WebSocket 在服务器上关闭。

如何使用 Play Framework 接收和发送 WebSocket 消息?

这是我的 Play Framework WebSocketController:

public class TestSocket extends WebSocketController {

    public static void hello(String name) {

        while(inbound.isOpen()) {
            WebSocketEvent evt = await(inbound.nextEvent());
            if(evt instanceof WebSocketFrame) {
                WebSocketFrame frame = (WebSocketFrame)evt;
                System.out.println("received: " + frame.getTextData());
                if(!frame.isBinary()) {
                    if(frame.getTextData().equals("quit")) {
                        outbound.send("Bye!");
                        disconnect();
                    } else {
                        outbound.send("Echo: %s", frame.getTextData());
                    }
                }
            } else if(evt instanceof WebSocketClose) {
                System.out.println("socket closed");
            }
        }
    }

}

这是我的 JavaScript 客户端:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>WebSocket test</title>
<style>
.message {background: lightgray;}
</style>
<script>
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=TestUser");

    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);
}
</script>
</head>
<body>
<h1>WebSocket test</h1>
<button id="connectbutton">Connect</button>
<button id="disconnectbutton">Disconnect</button><br>
<input type="text" id="messagefield"/><button id="sendbutton">Send</button>
<div id="status"></div>
</body>
</html>

最佳答案

我已经获取了您的代码并在 Chrome 14 和 15 以及 Firefox 7 上运行它,使用来自 Master Branch 的最新版本的 Play,它似乎大部分都能正常工作。我可以

  • 连接
  • 发送消息

我在哪里做的改变

  • 在全局范围内定义 ws,因此将 var ws = null 放在 window.onload 函数之前。
  • 对于 Firefox,我不得不使用 MozWebSocket 而不是 WebSocket,因此您可能需要放置一个 if 语句来根据浏览器进行检查。
  • frame.getTextData() 更改为 frame.textData
  • frame.isBinary()frame.isBinary

为了编译代码我必须做的第二个两点?!

关于java - 如何在 Play Framework 中使用 WebSockets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919856/

相关文章:

java - Spring - 获取所有可解析的消息键

java - 对GWT的不同后端的反馈

java - Java中如何判断一个jar文件的包名

构造函数的 JavaScript prototype.constructor 属性不在规范中?

javascript - 在 Node.js 中监听所有发出的事件

java - 从 Ebean sql 查询获取 Map<Long, Long>

java - JAX-WS 和 Tomcat : storing in InitialContext not possible?

javascript - 显示 : fullscreen doesn't work on manifest json

java - 渲染 Play Framework 2 View

java - 再次 : Postgres driver not found on Heroku with Play 2. 0/Java