如何使用WebSockets与Play框架



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

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

这是我的Play框架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上运行它,从主分支的最新版本播放,它似乎主要工作。我可以

  • 发送消息

我所做的更改

  • 在全局范围内定义ws,因此将var ws = null放在窗口前面。onload函数。
  • 对于Firefox,我不得不使用MozWebSocket而不是WebSocket,因此您可能需要根据浏览器添加if语句进行检查。
  • change frame.getTextData() to frame.textData
  • frame.isBinary()frame.isBinary

我必须做的第二件事是让代码编译?!

我在Chrome 20和Play 1.2.4上有上述代码问题

升级到1.2.5和工作像一个魅力!!

相关内容

  • 没有找到相关文章

最新更新