play 簡單的基於websocket的echo server
本文來自 圖靈社群@fairjm
轉截請註明出處
play實現簡單的基於websocket的echo server(怎麼這麼繞口!!)
以前看過的例子基本都是基於Iteratee
和Enumerator
,所以理解起來並不直觀(也許是我智商不夠),這裡有個簡單的實現方式。
(注:這邊的實現取自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擴充套件):
我們可以從第一次剛連線的請求裡看見,ws是通過第一次get請求用101來轉為ws:
總結一下:
這樣的方式我們壓根就看不見iteratee
和Enumerator
,而且非常方便感覺就像是兩個actor在通訊一樣。
同時上面的那本書還在MEAP,對play有興趣的不要錯過。
原始碼下載:
https://github.com/fairjm/simple-play-websocket-echo-server
相關文章
- 基於websocket的簡單廣播系統Web
- 基於websocket與nodejs-websocket的簡單聊天室WebNodeJS
- 基於 WebSocket 的 PPT 遠端控制器簡單實現Web
- 基於Websocket的簡易webshell實現Webshell
- 簡單的websocket demoWeb
- laravel websocket服務 echo-server搭建(redis驅動)LaravelWebServerRedis
- 學習WebSocket(一):Spring WebSocket的簡單使用WebSpring
- 高效簡易開發基於websocket 的通訊應用Web
- 簡單聊聊WebSocketWeb
- Websocket簡單例子Web單例
- 簡單談基於SQL SERVER 分頁儲存過程的演進SQLServer儲存過程
- 基於 Hyperf+ SQL Server 實現的一個簡單資料庫 curdSQLServer資料庫
- 基於Opencv的簡單影像處理OpenCV
- 基於springmvc的easypoi簡單使用SpringMVC
- WebSocket 簡單瞭解Web
- websocket簡單例項Web單例
- Play框架與NodeJS的簡單比較框架NodeJS
- 簡單 16步走一遍 Laravel Echo 的使用Laravel
- 一個最簡單的WebSocket hello world demoWeb
- 基於SSM框架的簡單問答社群SSM框架
- 基於mpvue的簡單彈窗元件mptoastVue元件AST
- 基於vue的簡單流程圖開發Vue流程圖
- WebSocket就是這麼簡單Web
- ping工具的C語言簡單實現 (ICMP echo)C語言
- 基於Redis的分散式鎖的簡單實現Redis分散式
- 簡單粗暴的 Caddy ServerServer
- 關於 WebSocket 和 HTTP 區別的思考以及一個最簡單的 WebSocket 的客戶端和伺服器實現WebHTTP客戶端伺服器
- 基於 ThinkJS 的 WebSocket 通訊詳解JSWeb
- 基於Laravel-websocket 的 laravel-ssh-clientLaravelWebclient
- 部署超簡單的 Golong 分散式 WebSocket 微服務Go分散式Web微服務
- 關於MongoDB的簡單理解(一)--基礎篇MongoDB
- 基於 Redis 實現簡單的分散式鎖Redis分散式
- js WebSocket用法簡單介紹JSWeb
- 基於JS簡單甘特圖JS
- 基於Vue.js的簡單的svg進度條Vue.jsSVG
- yii2-websocket | 基於 yii2 實現的 WebSocket 擴充套件Web套件
- 【SQL Server中SMO的簡單使用】SQLServer
- 基於 Golang/WebSocket/Canvas/Protobuf 的線上匿名交流遊戲GolangWebCanvas遊戲