play 簡單的基於websocket的echo server

fairjm發表於2015-04-24

本文來自 圖靈社群@fairjm
轉截請註明出處


play實現簡單的基於websocket的echo server(怎麼這麼繞口!!)
以前看過的例子基本都是基於IterateeEnumerator,所以理解起來並不直觀(也許是我智商不夠),這裡有個簡單的實現方式。
(注:這邊的實現取自Reactive Web Applications with Play,支援正版閱讀,下載盜版請關閉網頁謝謝)

activator新建一個play專案:

activator new echoserver_play 選擇play-scala

進入專案,用sbt或者activator匯出為eclipse專案:

F:\activator\echoserver_play>sbt
[info] Loading global plugins from C:\Users\fairj_000\.sbt\0.13\plugins
[info] Loading project definition from F:\activator\echoserver_play\project
[info] Set current project to echoserver_play (in build file:/F:/activator/echoserver_play/)
yuki.N>eclipse with-source=true

views不要,把包下的檔案直接刪掉好了

建立一個actors包,我們在裡面放actor,其實建什麼包都可以,隨自己喜歡:

package actors

import akka.actor.Actor
import akka.actor.ActorRef

class EchoActor(out: ActorRef) extends Actor {

  override def preStart(): Unit = out ! "echo server by play"

  override def receive = {
    case s => out ! s
  }
}    

object EchoActor {
  def props(out:ActorRef) = {
    Props(new EchoActor(out))
  }
}

out表示外部的actor,我們這裡可以直接簡單地理解成客戶端(使用者的瀏覽器)。這個actor做很簡單的工作,有新使用者接入了先發一句問候語,當使用者傳送了資訊過來,原封不動就扔回去。

action:

package controllers

import play.api._
import play.api.mvc._
import actors.EchoActor
import play.api.Play.current

object Application extends Controller {

  def echo = WebSocket.acceptWithActor[String, String] { request =>
    out =>
      EchoActor.props(out)
  }

}

對應的routes:

GET /echo controllers.Application.echo

然後用run啟動專案:

yuki.N>run

--- (Running the application, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 4 Scala sources and 1 Java source to F:\activator\echoserver_play\target\scala-2.11\classes...
[info] play - Application started (Dev)
[info] play - Starting application default Akka system.  

最後試驗一下(工具是Simple Web Socket Client,chrome擴充套件):
enter image description here

我們可以從第一次剛連線的請求裡看見,ws是通過第一次get請求用101來轉為ws:
enter image description here

總結一下:
這樣的方式我們壓根就看不見iterateeEnumerator,而且非常方便感覺就像是兩個actor在通訊一樣。
同時上面的那本書還在MEAP,對play有興趣的不要錯過。

原始碼下載:
https://github.com/fairjm/simple-play-websocket-echo-server

相關文章