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
290
やっぱりわからんTaskの話
masui_masanori
0
180
AzurePipelinesでコンティニュアスにインテグレーションしたい
masui_masanori
0
1.7k
Razorに触れてみた
masui_masanori
0
140
ASP.NET Coreに入門した話
masui_masanori
0
330
Compare Java's 'var' with C#'s 'var'.
masui_masanori
0
1.5k
Other Decks in Programming
See All in Programming
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.5k
Next.js: The final boss of Web Performance
guaca
0
380
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
610
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
230
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
340
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
120
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.1k
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
5.1k
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
170
AI駆動開発4年目の現在地(『あなたはFDEになるべきか?』イベント資料)
kumaiu
0
130
Spec-driven Development with AI
simas
PRO
0
2.2k
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
600
The Cult of Friendly URLs
andyhume
79
7.1k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Designing for humans not robots
tammielis
254
26k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
Balancing Empowerment & Direction
lara
6
1.4k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
310
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!