はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity 簡単にWebSocket通信が行えるWebSocketSharpの紹介

あいさつ

どうも、はかせです。
今回は少し毛色を変え
便利なライブラリの紹介です。

今回紹介するライブラリは、
C#使える環境ならば簡単に使える
WebSocket通信用ライブラリ「WebSocketShrap」です。

WebSocketSharpとは

C#でのWebSocket通信を楽に実装できるよう
作成されたライブラリです。
サーバー、クライアント両対応です。

前準備

まずは下記ページからリポジトリを落としてきます。
github.com

落として来たらこんな感じのファイル構成になっているはずです。
f:id:hakase0274:20190830223349p:plain

必要なのは「websocket-sharp」だけなので
Exampleたちは削除してしまってください。
(こいつらがいるとビルドするのがめんどうなので)

Exampleを消したらソリューションを開き、
構成を「Release」にしてビルドします。
そしたらwebsocket-sharp.dllができますので
こいつをUnityプロジェクトに入れます。

これで使う前準備は終わりました。

実際に使う

では準備も終わったところで
実際に使ってみます。

サーバー、クライアント両対応ということで
両方とも試してみます。

サーバー

まずはコードからです。

using UnityEngine;
using WebSocketSharp;
using WebSocketSharp.Server;

public class TestWSServer : MonoBehaviour
{
    WebSocketServer server;
    // Start is called before the first frame update
    void Start()
    {
        server = new WebSocketServer(3000);
        server.AddWebSocketService<Echo>("/");
        server.Start();
    }

    void OnDestroy()
    {
        server.Stop();
        server = null;
    }
}

public class Echo : WebSocketBehavior
{
    protected override void OnMessage(MessageEventArgs e)
    {
        Sessions.Broadcast(e.Data);
        Debug.Log(e.Data);
    }
}

サーバー立てるのは極めて単純で
WebSocketServerクラスにポート番号渡して
インスタンス生成するだけです。

ただこのままだとなにもありません。
ただポートが空いてるだけの
無意味なサーバーです。

意味のあるサーバーにするために
AddWebSocketServiceメソッドを使い、
サーバーサイドのプログラムをセッティングします。

まずこのメソッドを呼ぶ前にWebSocketBehaviorを
継承したクラスを作成します。
WebSocketBehaviorのメソッドを上書きすることで
サーバーサイドのプログラム作ります。

クラスの作成が終わったらAddWebSocketServiceメソッドに
そのクラスを渡して呼び出します。
これでサーバーサイドで動くプログラムのセッティングは終了です。

とりあえずサーバーにメッセージを送った
Unityのログに出力&接続しているクライアントに
メッセージをキャストするだけの簡単なプログラムです。

では試してみましょう。
今回テストにはwscatを使います。
wscatについては多分ググればわかると思うので
この記事では説明は割愛します。
f:id:hakase0274:20190830230140p:plain

サーバー(Unity)にも
クライアント(コンソール)にもメッセージがいってますね。

クライアント

using UnityEngine;
using WebSocketSharp;

public class TestWS : MonoBehaviour
{
    WebSocket ws;

    public string wsurl;

    void Start()
    {
        ws = new WebSocket(wsurl);

        ws.OnOpen += (o, e) => { print("Open"); };
        ws.OnError += (o, e) => { print(e.Message); };
        ws.OnMessage += (o, e) => { print(e.Data); };
        ws.Connect();

    }

    void Update()
    {
        if (Input.GetKeyUp("s"))
        {
            ws.Send("Test");
        }
    }

    void OnDestroy()
    {
        ws.Close();
        ws = null;
    }
}

クライアントはWebSocketクラスに接続する
エンドポイントのURLを渡して生成するだけです。

あとはOnOpenだとかのイベントに
処理を追加していきます。
イベントなんでラムダでもメソッドでもOKです。
f:id:hakase0274:20190830230834p:plain

メッセージ送るのも受け取るのも正常に動いています。

あとがき

今回はライブラリの紹介でした。
WebSocket通信は結構WebAPI使うのに使いますし、
その通信が楽に書けるこのライブラリは個人的にお気に入りです。

通信とかアセット周りは自作がめんどくさい大変なので
こういうライブラリなどを使って手早く実装してしまうのがいいですね。

それでは今回はこの辺でノシ