Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
UnityアプリをSpringbootのWebSocketでつないでみた
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
300
C#erがTypeScriptでフロントエンドに挑戦している話
masui_masanori
0
290
ASP.NET CoreやTypeScriptの力を借りてレガシー寄りの環境に立ち向かいたかった話
masui_masanori
1
270
やっぱりわからんTaskの話
masui_masanori
0
170
AzurePipelinesでコンティニュアスにインテグレーションしたい
masui_masanori
0
1.6k
Razorに触れてみた
masui_masanori
0
130
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
FDEが実現するAI駆動経営の現在地
gonta
2
270
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
580
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
590
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
520
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
その節約、円になってますか?
isamumumu
1
690
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
470
Thoughts on Productivity
jonyablonski
76
5.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
450
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
330
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Between Models and Reality
mayunak
4
380
Ethics towards AI in product and experience design
skipperchong
2
340
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.2k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
350
How STYLIGHT went responsive
nonsquared
100
6.2k
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!