Play Framework 2.3 和 javascript websocket 客户端库

Posted

技术标签:

【中文标题】Play Framework 2.3 和 javascript websocket 客户端库【英文标题】:Play Framework 2.3 and javascript websocket client library 【发布时间】:2014-06-02 18:11:51 【问题描述】:

我已经使用 Scala 2.11 安装了新的 Play Framework 2.3,我将使用 websocket 构建一个应用程序。

带有 scala 的服务器,代码非常简单:

object TestWebSocket extends Controller 

  def mysocketservice = WebSocket.acceptWithActor[String, String]  request => out =>
    TestSocketActor.props(out)
  

route.conf 是: GET /wsk/testwebsocket controllers.TestWebSocket.mysocketservice

现在我需要一个 javascript 代码来将我的页面与 scala 代码连接起来,我可以使用什么 javascript 库?我见过一个 socket.io,但似乎只适用于 node.js 服务器。

我知道我可以直接使用 WebSocket,但我将使用像 socket.io 这样的库来与旧浏览器兼容。

有人可以帮助我吗? 非常感谢

【问题讨论】:

如果有人有兴趣,有一个使用 scala 和 netty 的 socket-io 的项目,我认为可以将它集成到游戏框架中:github.com/mrniko/netty-socketio 【参考方案1】:

试试这个 javascript。这是在 Chrome、Safari、Mozilla 等上执行此操作的标准方式。

<script type="text/javascript">
    function WebSocketTest()
        if ("WebSocket" in window) 
        var ws = new WebSocket("@routes.controllers.TestWebSocket.mysocketservice().webSocketURL()");
        ws.onopen = function()
            // Web Socket is connected, send data using send()
            console.log("connected");
            ws.send("Message to send");
        ;

        ws.onmessage = function (evt)
            var received_msg = evt.data;
            console.log(evt.data);
        ;

        ws.onclose = function()
            // websocket is closed.
            alert("Connection is closed...");
        ;
        else
            // The browser doesn't support WebSocket
            alert("WebSocket NOT supported by your Browser!");
        
    
WebSocketTest();
</script>

让我知道进展如何。

【讨论】:

谢谢Dario,我是直接使用WebSocket的,但是为了兼容旧版浏览器并不是一个好主意。我希望将来 socket.io 将与 playframework >=2.3 的 websocket 兼容。谢谢 如果是这种情况,您可能想要使用 EventSource 之类的东西......就像 Comet 套接字。【参考方案2】:

您不一定需要客户端库来利用 WebSockets。 Mozilla 提供了关于 WebSockets API here 的可靠文档。

话虽如此,如果您希望旧版浏览器上的访问者能够利用您的 WebSocket 功能,您可能需要研究像 SockJS 这样可以优雅地回退到劣质(但得到更好支持)协议的项目,如果需要。

【讨论】:

是的,我直接使用WebSocket,但是为了与旧浏览器的兼容性,这不是一个好主意。我希望将来 socket.io 将与 playframework >=2.3 的 websocket 兼容。谢谢 请注意,我还提供了一个指向 SockJS 的链接,它可以提供与您需要的旧浏览器的兼容性。 More info can be found here.【参考方案3】:

我使用优雅的 websocket。它非常直观,隐藏了所有复杂性。

https://code.google.com/p/jquery-graceful-websocket/

// open socket using standard syntax
ws = $.gracefulWebSocket("ws://localhost:9000/soc"); //use wss for https
ws.onmessage=onSocMsg;

function onSocMsg(event)
  var jsonObj=json.fromString(event.data);
  alert(event.data);

【讨论】:

以上是关于Play Framework 2.3 和 javascript websocket 客户端库的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.3 - 无法连接到远程数据库 Linux (Play) -> Win 7 (MySQL)

迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错

如何在 Play Framework 2.3 中向 FakeRequest 添加查询字符串参数?

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改

Play Framework 2.4 全局对象迁移

如何在 Play 中的所有响应中设置标题!框架 2.7 (Java)