简单的WebSocket在Scala/Akka/Play中的实现

19

我想使用Scala / Akka / Play创建一个简单的Websocket应用程序。

从示例(例如webchat Scala Days的最近演讲)中所看到的是JavaScript / Coffeescript、HTML模板等技术的混合应用。

我的Websocket应用程序的客户端也将是本地移动应用程序(Android,iOS),因此我需要进行“超越浏览器”的思考。

如何创建一个能简单推送“hello”字符串的Websocket应用程序?


我有点困惑。WebSockets是一种解决方案,因为HTTP不允许双向有状态连接。但是,当你开发本地应用程序时,你没有这个限制(除非你使用Apache Cordova或类似的工具,但那时你会使用Javascript)。那么,你为什么要选择这条路呢? - Carsten
嗨,卡斯滕。 我不知道是否有其他双工协议允许服务器向客户端实时推送数据。原生应用程序的推送通知服务(如GCM)并不是实时的。你知道任何替代方法吗? - ticofab
0MQ是流式发布/订阅的解决方案。http://zeromq.org/ - Yike Lu
@ticofab:也可以看一下 XMPP。 - Jus12
2个回答

20

WebSocket连接由服务器端和客户端两个部分组成。您可以使用Play2制作服务器端,使用Android(请参见websocket-android-phonegap)、iOS(请参见Unitt)或JavaScript应用程序实现客户端。

以下是一个基本的WebSocket连接示例,摘自http://blog.tksfz.org/2012/10/12/websockets-echo-using-play-scala-and-actors-part-i/

package controllers

import play.api.mvc._

object Application extends Controller {
  def index = WebSocket.using[String] {
    val out = Enumerator.imperative[String]()
    val in = Iteratee.foreach[String] {
      msg =>
        out.push(msg)
    }
    (in, out)
  }
}

您只需设置一个指向控制器conf/routes的路由即可:

GET /connect  Application.index
服务器已经准备好运行。您可以使用 JavaScript 应用程序、Android 应用程序等连接到您的 WebSocket。客户端则是另一回事。
如果您使用 Chrome 或 Chromium,只需在开发人员工具中打开 JavaScript 控制台,就可以像这样连接到服务器:
ws = new WebSocket('ws://localhost:9000/connect')
ws.onmessage = function( message ) { console.log( message ); };
ws.send('test')

每当您发送消息时,它将把消息发回给您并将其记录在javascript控制台中。

您还可以使用http://www.websocket.org/echo.html 回声测试,并将您的 'ws://localhost:9000/connect' url发送到其中。


8
Enumerator.imperative 看起来在最近的 Play 版本中已经被弃用或删除,这是一个在较新版本中的回声应用程序:http://blog.controlgroup.com/2013/10/17/simple-websockets-example-play-2-2-0/ 希望对其他人有所帮助... - okonomichiyaki
那个链接已经失效了,请尝试这个链接:https://www.playframework.com/documentation/2.5.x/ScalaWebSockets#Handling-WebSockets-with-iteratees - Gimme the 411

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接