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與nodejs-websocket的簡單聊天室WebNodeJS
- 基於websocket的簡單廣播系統Web
- 基於 WebSocket 的 PPT 遠端控制器簡單實現Web
- 基於Websocket的簡易webshell實現Webshell
- laravel websocket服務 echo-server搭建(redis驅動)LaravelWebServerRedis
- 簡單的websocket demoWeb
- 基於 Hyperf+ SQL Server 實現的一個簡單資料庫 curdSQLServer資料庫
- 簡單聊聊WebSocketWeb
- 基於WebSocket的modbus通訊(三)- websocket和串列埠Web串列埠
- 基於Opencv的簡單影像處理OpenCV
- 簡單 16步走一遍 Laravel Echo 的使用Laravel
- WebSocket 簡單瞭解Web
- 基於SSM框架的簡單問答社群SSM框架
- 基於mpvue的簡單彈窗元件mptoastVue元件AST
- 一個最簡單的WebSocket hello world demoWeb
- 基於webapi的websocket聊天室(四)WebAPI
- 基於 ThinkJS 的 WebSocket 通訊詳解JSWeb
- WebSocket就是這麼簡單Web
- 關於 WebSocket 和 HTTP 區別的思考以及一個最簡單的 WebSocket 的客戶端和伺服器實現WebHTTP客戶端伺服器
- 基於Python的簡單天氣爬蟲程式Python爬蟲
- 基於 Prometheus 的監控神器,簡單靈活!Prometheus
- 關於MongoDB的簡單理解(一)--基礎篇MongoDB
- 部署超簡單的 Golong 分散式 WebSocket 微服務Go分散式Web微服務
- C# WebSocket的簡單使用【使用Fleck實現】C#Web
- 簡單的mock-server 解決方案MockServer
- 基於Laravel-websocket 的 laravel-ssh-clientLaravelWebclient
- 基於Vue.js的簡單的svg進度條Vue.jsSVG
- 一個簡單的基於Debian的開發環境。開發環境
- Linux基礎命令:echo的使用Linux
- 基於Promise實現對Ajax的簡單封裝Promise封裝
- 基於 flask 結合 Redis 的簡單聊天室FlaskRedis
- 使用WebSocket實現一個簡單的頁面聊天Web
- yii2-websocket | 基於 yii2 實現的 WebSocket 擴充套件Web套件
- 對一條基於分割槽的簡單SQL的優化SQL優化
- 基於websocket的celery任務狀態監控Web
- Go實現基於WebSocket的彈幕服務GoWeb
- 基於webapi的websocket聊天室(番外二)WebAPI
- 基於webapi的websocket聊天室(番外一)WebAPI
- 基於WebSocket的modbus通訊(一)- 伺服器Web伺服器