UnityでOculus Quest用のVRアプリを作ってみると、Questとの通信はnode.jsで行っているようなので、ちょっとnode.jsを試してみました。
借りているSakuraVPSにnode.jsをインストールしてサーバーを立ててみます。
centos7上で、node.jsをインストールします。
yum install nodejs
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(port番号は秘密);
というのをhelloworld.jsで保存して、
node helloworld.js&
と実行します。
指定したポート番号をListenした状態でサーバーが常駐します。
Windowsのコンソールから、サーバーのグローバルIPアドレスにserverで指定したport番号を指定してcurlで接続します。
Hello WorldがSakuraVPS上のサーバーから帰ってきます
これを実現するには、CentOS側のfirewalldでポート番号を開けておく必要があります。
同様にクライアント側のWindowsも指定したポート番号を開けておく必要があります。
次はさっそくクライアントをUnityにしてみましょう。
と思って、
websocket-sharpというソースをDLしてみたり、アセットストアでSocketIO関係のツールを買ってみたりしましたが、クライアントから接続できません。
windowsのコンソールからはつながるので、セキュリティ設定の問題ではないと思うのですが、
半日ぐらい悩みましたが、上記のサーバーのサンプルはhttpプロトコルになっていて、Unity用のクライアントは、WebSocketというプロトコルでそこに違いがあったようです。
websocket-sharpのクライアントのソースを、以下のws:の部分をhttp;に変えてもDLL自体がエラーになるだけでした( ^ω^ )
ws = new WebSocket("ws://VPSのグローバルIP:ポート番号/");
というわけで、サーバー側をWebSocketに変えてみます。
const server = require('ws').Server; const ws = new server({ port: ポート番号は秘密 }); ws.on('connection', socket => { socket.on('message', ms => { ws.clients.forEach(client => { client.send('Hello, this message comes from server!'); }); }); socket.on('close', () => { console.log('good bye.'); }); });
しかし、これをnodeで実行するとエラーになります。wsが見つからないみたいなエラーです
wsはおそらくWebSocketの略でしょう
検索しても古い情報が多く、
npm install socket.io
でインストールできるようですが、これではインストールできませんでした。yumでは無いんでしょうか?
CentOS - centOS7にてsocket.ioのインストールがうまくいかない|teratail
上記のページを参考に、
npm install socket.io@1.3.6
でインストールできました
これでwsを使った上記のサーバーを常駐し、
websocket-sharpのクライアントが無事動きました!。・゚・(ノ∀`)・゚・。
やった!ついにソケット通信できた!
ソケット通信は去年ぐらいからPerlでサーバーを作ったりして時々やってたんですが、全然うまく行かなかったんですが、感動しました。・゚・(ノ∀`)・゚・。
アセットストアで買ったアセットには、Andorid/iOS/WebGL/PCに対応したものもあったので、そのへんもやってみたい。
上記のサーバーサンプルはソケット通信が接続しているクライアントすべてにメッセージを送るものです。
仕組み的には、ユーザーのIDと位置・向きをサーバーに送信すると、サーバーが全ユーザーに情報を再送信すればネットゲームが作れますね
(実際は、遅延のある通信環境でなめらかに動かす技術や通信料を削減する技術などがたくさんある)