16. Play2.0のサイト構築、基本の流れ(Java)
➡ モデルの構築
• テスト:Unit Test
➡ コントローラーの構築
• テスト:Functional Test
➡ ビューの構築
• テスト:Selenuimベースのfluentlenium
https://github.com/karad/PlayWebSocketReversi 16
17. モデル
➡ ORMとしてEBeanを採用
➡ findやバリデーション(Constraints.*)に対応
@Entity
public
class
User
extends
Model{
@Id
public
Long
id;
@Constraints.Required
public
String
name;
}
https://github.com/karad/PlayWebSocketReversi 17
18. コントローラ
➡ 基本、Resultを返す
public
class
Application
extends
Controller
{
public
static
Result
index()
{
return
ok(index.render());
}
}
https://github.com/karad/PlayWebSocketReversi 18
22. Flashでのリアルタイム通信
➡ Adobe Flash Communication Server
➡ Adobe Flash Media Server
Real Time Messaging Protocol(RTMP)
➡ Red5
• http://www.red5.org/
• Javaで作られている
• オープンソース
https://github.com/karad/PlayWebSocketReversi 22
26. web-socket-js
➡ https://github.com/gimite/web-socket-js
• Google Chrome 4 or later, Firefox 6 or later
• Firefox 3 to 5, Internet Explorer 8, 9 + Flash Player 10 or later
https://github.com/karad/PlayWebSocketReversi 26
56. Reversi作成の手順
➡ Playアプリケーションの作成
➡ メッセージフォーマットの設計
➡ イベントモデルの設計
➡ コントローラ、モデルの作成
➡ ルーティングの作成
➡ ビューの作成
【参考】作業ステップをつけています
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 56
57. Playアプリケーションの作成(1)
➡ システム企画
• ユーザーは2人(BlackとWhite)の選択
• 盤面をロールオーバーすると相手にも伝わる
• 盤面をクリックすると自分の色に変わる
• 駒はどこでも配置可能
画面遷移 WebSocket
Login Game WS
トップページ ゲーム画面
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 57
58. Playアプリケーションの作成(2)
➡ トップページ
Login
• http://URL/
➡ ゲーム画面
• http://URL/reversi/ Game
➡ WebSocket
• ws://URL/reversi/game?username=hoge WS
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 58
59. Playアプリケーションの作成(3)
➡ コントローラ
• app/controllers/Application.java
- HTTPリクエストを受けるところ
➡ モデル
• app/models/Reversi.java
- WebSocket周りのイベント処理を記述
➡ ビュー
• app/views/index.scala.html
• app/views/main.scala.html
• app/views/reversi.scala.html
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 59
60. メッセージのフォーマット(JSON)を決める
➡ kind
• join、talk、quitの各種フラグ
➡ user
• ユーザー名(black or white)
➡ x、y
➡ uuid
• 各升目のユニークid
➡ message
• thinkOver、thinkOut、black、whiteの各メッセージ
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 60
61. イベントの種類を決める
➡ 各イベントごとにクラスを作成
➡ public static class
Join(username、channel) … 参加
➡ public static class
Message(username、text、x、y、uuid) … 送信
➡ public static class
Quit(username) … 終了
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 61
62. コントローラの作成(1):Application.java
➡ 各種メソッドを実装
➡ public static Result
index() … トップページ
• index.scala.html を表示
➡ public static Result
reversi(username) … ゲーム画面
• ゲーム画面用アクション
• ユーザー名を取得し、ゲーム画面 reversi.scala.html を表示
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 62
63. コントローラの作成(2):Application.java
➡ public static WebSocket<JsonNode>
game(final String username) … WebSocket
• WebSocket用アクション
• 初接続時は、ユーザー名をメンバーとしてJoinメソッドを呼び出し
• 2回目以降は、JsonFrameをInboundとして処理
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 63
64. モデルの作成(1):Reversi.javaの構成
➡ static ActorRef
game … アクター
➡ Map<String, WebSocket.Out<JsonNode>>
members … メンバー一覧
➡ public static void
join(username, in, out) … 参加メソッド
➡ public void
onReceive(message) … 受信
➡ public void
notifyAll(kind, user, text, x, y, uuid) … 全員に通知
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 64
65. モデルの作成(2)
➡ イベント用のインナークラス用意
• Join
public
static
class
Join
{
• Message
final
String
username;
• Quit
final
WebSocket.Out<JsonNode>
channel;
public
Join(
String
username,
WebSocket.Out<JsonNode>
channel
)
{
this.username
=
username;
this.channel
=
channel;
}
}
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 65
66. モデルの作成(3)
➡ static ActorRef
game … アクター
static
ActorRef
game
=
Akka.system().actorOf(new
Props(Reversi.class));
➡ Map<String, WebSocket.Out<JsonNode>>
members … メンバー一覧
Map<String,
WebSocket.Out<JsonNode>>
members
=
new
HashMap<String,
WebSocket.Out<JsonNode>>();
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 66
67. モデルの作成(4)
➡ public static void
join(username, in, out) … 参加メソッド
• 接続を行う最初のみ呼び出される
• ユーザー名と、Inbound、Outboundを引数
• Joinクラスのインスタンスをメッセージとしてgameに送信
• InboundのonMessageハンドラを設定
- Messageクラスのインスタンスを送信
• InboundのonCloseハンドラ時を設定
- Quitクラスのインスタンスを送信
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 67
68. モデルの作成(5)
➡ public void
onReceive(message) … 受信
• 送信されてきたメッセージのクラスによって処理を振分け
• Joinクラスだった場合
- メンバーに追加
• Messageクラスだった場合
- Outboundにメッセージを送信
• Quitクラスだった場合
- メンバーからusernameを削除
- 退出のメッセージ
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 68
69. onReceiveメソッドの抜粋
public
void
onReceive(Object
message)
throws
Exception
{
if
(message
instanceof
Join)
{
//
Received
a
Join
message
}
else
if
(message
instanceof
Message)
{
Message
talk
=
(Message)
message;
notifyAll(
"talk",
talk.username,
talk.text,
talk.x,
talk.y,
talk.uuid);
}
else
if
(message
instanceof
Quit)
{
//
Received
a
Quit
message
}
}
https://github.com/karad/PlayWebSocketReversi 69
70. モデルの作成(6)
➡ public void
notifyAll(kind, user, text, x, y, uuid) … 全員に通知
• 各プロパティをJSON形式で格納
• JSONをメンバー全員に送信
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 70
71. ルーティングの設定
➡ ルーティングは、conf/routesファイルを編集
GET
/
controllers.Application.index()
GET
/reversi
controllers.Application.reversi
(username:
String
?=
null)
GET
/reversi/game
controllers.Application.game
(username)
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 71
72. ビュー周りの設定(1):ビューですること
➡ レイアウトの用意
➡ ログイン画面を用意
➡ ゲーム画面を用意
➡ ゲーム用のクラスを用意
➡ 通信用のJavaScriptを用意
➡ マウスイベント用のJavaScriptを用意
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 72
73. ビュー周りの設定(2)
➡ レイアウトの用意
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 73
74. ビュー周りの設定(3)
➡ ログイン画面を用意
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 74
75. ビュー周りの設定(4)
➡ ゲーム画面を用意
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 75
76. ビュー周りの設定(5)
➡ ゲーム用のクラスを用意
.white .black .thinkOut .thinkOver
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 76
77. ビュー周りの設定(6)
➡ 通信用のJavaScriptを用意
• WebSocketに接続
• メッセージを受信したら、内容に応じて処理
• kindがtalkなら、駒の配置もしくはロールオーバーの表示
var
chatSocket
=
new
WS("WEBSOCKET")
var
receiveEvent
=
function(event)
{
var
data
=
JSON.parse(event.data);
//
各種処理
}
chatSocket.onmessage
=
receiveEvent;
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 77
78. ビュー周りの設定(7)
➡ マウスイベント用のJavaScriptを用意
• mouseover時
- textに"thinkOver"
- x座標、y座標、uuidに $(this).attr('id')
• mouseout時
- textに"thinkOut"、その他は同じ
• click時
- textに"ユーザー名"、その他は同じ
➡ WebSocketとして送信
• chatSocket.send(JSON.stringify(オブジェクト));
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 78
79. WebSocket通信中のJSON
➡ コマンドラインにて確認可能
org.codehaus.jackson.node.ObjectNode@8bfaf9f[
_children={kind="talk",
user="black",
x=5,
y=4,
uuid="4_5",
message="thinkOut",
members=["black"]}
_nodeFactory=org.codehaus.jackson.node.JsonNodeFactory
@fbf00a9
];
Restful Make Format Event Scheme Model and Controller Routing Front
https://github.com/karad/PlayWebSocketReversi 79