Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
UnityアプリをSpringbootのWebSocketでつないでみた
Search
masanori_msl
May 18, 2017
Programming
2.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UnityアプリをSpringbootのWebSocketでつないでみた
2017.5.20 JJUG CCC 2017 SpringのLT大会用の資料です。
masanori_msl
May 18, 2017
More Decks by masanori_msl
See All by masanori_msl
WPFで印刷しよう!
masui_masanori
1
1k
Programming ASP.NETCore を推したい話
masui_masanori
0
320
C#erがTypeScriptでフロントエンドに挑戦している話
masui_masanori
0
290
ASP.NET CoreやTypeScriptの力を借りてレガシー寄りの環境に立ち向かいたかった話
masui_masanori
1
280
やっぱりわからんTaskの話
masui_masanori
0
180
AzurePipelinesでコンティニュアスにインテグレーションしたい
masui_masanori
0
1.6k
Razorに触れてみた
masui_masanori
0
140
ASP.NET Coreに入門した話
masui_masanori
0
320
Compare Java's 'var' with C#'s 'var'.
masui_masanori
0
1.4k
Other Decks in Programming
See All in Programming
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
22
22k
Railsバージョンを4倍にした話
optim
0
120
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
170
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
500
Domain-Driven Transformation
hschwentner
2
2.3k
速習iPhone Duo対応
yuukiw00w
2
980
ActionController meets Protocol Buffers
sorah
0
260
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
0
150
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
410
気持ちぃ〜角丸 Squircle
ryu1013
0
290
Workers Cache を知る
syumai
0
360
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
170
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Leo the Paperboy
mayatellez
10
2.4k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
930
Google's AI Overviews - The New Search
badams
0
1.6k
The Curse of the Amulet
leimatthew05
3
15k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
750
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Transcript
UnityアプリをSpring bootの WebSocketでつないでみた 2017.05.20 @JJUG CCC 2017 Spring
Who? Name: Masui Masanori Twitter: @masanori_msl Blog: vaguely http://mslgt.hatenablog.com/ GitHub:
https://github.com/masanori840816
やりたいこと 複数のUnityアプリ同士を WebSocketで連携してリモート操作する
Demo
What's WebSocket? Client側とServer側で双方向通信する仕組み 1.Client側からリクエスト送信 2.Server側がレスポンスを返す 3.Client側がレスポンスを受けて接続確立 4.接続を閉じるまでメッセージのやりとりを行う
Spring bootでWebSocketを使う Using WebSocket to build an interactive web application
– Spring https://spring.io/guides/gs/messaging-stomp- websocket/ このサンプルではSTOMP over WebSocketを 使って通信している
What's STOMP? • Simple (or Streaming) Text Orientated Messaging Protocolの略
• 接続確立時にメッセージの宛先をSubscribeし、 Client側やServer側からメッセージを送信すると、 Subscriberはそのメッセージを受け取る
C#で STOMP over WebSocketを 扱う方法がわからない …orz C#でSTOMP over WebSocket?
C#でSTOMP over WebSocket? C#でSTOMPを扱うライブラリは (Apache.NMS.STOMPなど)存在するが、 最終更新日が2013年だったりドキュメントが 少なかったりと厳しい(´・ω・`)
仕事を投げ出す男性のイラスト 画像引用元:いらすとや - http://www.irasutoya.com/2015/10/blog-post_205.html
STOMPを使わずに通信する(C#) WebSocket-sharpを使う https://github.com/sta/websocket-sharp Unityだけでなく C#でWebSocketを扱うことができるライブラリ
STOMPを使わずに通信する(C#) using UnityEngine; using WebSocketSharp; [Serializable] public class ObjectStatus {
public float PositionX; public float PositionY; public float PositionZ; } public class WebSocketCtrl : MonoBehaviour { private WebSocket wsocket; private ObjectStatus objectStatus; private bool connected;
private void Start() { objectStatus = new ObjectStatus(); wsocket =
new WebSocket("ws://localhost:8080/ws"); // イベント追加. wsocket.OnOpen += (sender, e) => connected = true; // 接続確立時. wsocket.OnClose += (sender, e) => connected = false; // 切断時. wsocket.OnMessage += (sender, e) => // メッセージ受信時. { // メッセージ受信時の処理.受け取った値を変換. var status = JsonUtility.FromJson<ObjectStatus>(e.Data); }; // Serverに接続. wsocket.Connect (); } private void Update() { if (Input.GetMouseButton(1))
{ // 右クリックでドラッグした時にメッセージを送信. objectStatus.PositionX = 1.0f; objectStatus.PositionY = 1.0f; objectStatus.PositionZ
= 1.0f; if (connected) { var json = JsonUtility.ToJson(objectStatus); wsocket.Send (json); // メッセージの送信. } } } private void OnDestroy() { wsocket.Close(); // アプリを閉じる前に接続を閉じる. } }
STOMPを使わずに通信する(Spring boot) 準備 • Spring Initializrでプロジェクトを作る (WebSocketにチェックを入れる)
STOMPを使わずに通信する(Spring boot) 最低限追加が必要なクラスは2つ • Config class ↓をWebSocketHandlerRegistryに追加する • Handler class
接続確立時、メッセージ受信時などのイベント を受け取る
Config class @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {
@Override public void registerWebSocketHandlers( WebSocketHandlerRegistry registry) { // Handlerを追加してイベントを受信できるようにする. registry.addHandler(new MessageHandler(), "/ws"); } @Bean public WebSocketHandler messageHandler() { return new MessageHandler(); } }
Handler class public class MessageHandler extends TextWebSocketHandler { private ArrayList<WebSocketSession>
users; public MessageHandler(){ users = new ArrayList<>(); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 接続が確立されたら呼ばれる. if(uses.stream() .noneMatch(user -> user.getId().equals(session.getId()))){ users.add(session); } }
@Override public void handleTextMessage(WebSocketSession session, TextMessage message) { // メッセージを受信したら送信元以外に送る.
users.stream() .filter(user -> !user.getId().equals(session.getId())) .forEach(user -> { try{ user.sendMessage(message); } catch (IOException ex){ } }); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
// 接続が閉じられたらリストから外す. users.stream() .filter(user -> user.getId().equals(session.getId())) .findFirst() .ifPresent(user -> users.remove(user));
} }
TextWebSocketHandler public class TextWebSocketHandler extends AbstractWebSocketHandler { @Override protected void
handleBinaryMessage(WebSocketSession session, BinaryMessage message) { try { session.close(CloseStatus.NOT_ACCEPTABLE. withReason(“Binary messages not supported")); } catch (IOException ex) { // ignore } } }
• バイナリメッセージが送信されると、 そのセッションを閉じる仕様 • 今回は文字列だけを扱っていたが、 それ以外の値が送られる場合は注意が必要 TextWebSocketHandler
感想 • シンプルなコードで実現できてすごい(小並感) • 今回のDemoのレベルでは気にならなかったが、 特に高パフォーマンスが要求されるVRでは コストを抑えるための工夫が必要かも?
Spring Framework Spring徹底入門 (http://www.shoeisha.co.jp/book/detail/9784798142470) WebSocket 26. WebSocket Support - Spring
(https://docs.spring.io/spring/docs/current/spring- framework-reference/html/websocket.html) Windows 8 のネットワーク接続 - Windows 8 と WebSocket プロトコル - MSDN (https://msdn.microsoft.com/ja-jp/magazine/jj863133.aspx) WebSocketについて調べてみた。 - Nao Minami’s Blog (http://south37.hatenablog.com/entry/2014/09/07/WebSocketについて調べてみた。) websocket-sharp - sta - GitHub (https://github.com/sta/websocket-sharp) STOMP STOMP (https://stomp.github.io/stomp-specification-1.2.html) 参考
STOMP Over WebSocket (http://jmesnil.net/stomp-websocket/doc/) Using WebSocket to build an interactive
web application - Spring (https://spring.io/guides/gs/messaging-stomp-websocket/) Spring 4.3 WebSocket関連の主な変更点(+簡易アプリ作成!!) - Qiita (http://qiita.com/kazuki43zoo/items/f2eac11f94e2afc7c964) 6. STOMPを使ってみる — Spring Bootキャンプ ハンズオン資料 1.0.0-SNAPSHOT ドキュメン ト (http://spring-boot-camp.readthedocs.io/ja/latest/06-STOMP.html) Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう! - SlideShare (https://www.slideshare.net/javawomen/spring-bootweb-62247552) Unity JSON 形式にシリアライズ - Unity - マニュアル (https://docs.unity3d.com/ja/540/Manual/JSONSerialization.html) 参考
Thank you!