ごった煮

色々な事を書いてます

SignalRの紹介その2

前回のSignalRの紹介では, サーバサイドであるHubの実装についての説明をしましたが, 今回は, クライアントサイドの実装の紹介をしていこうと思います. 紹介するのは, C#のコードですが, SignalRのapiは, Javascriptなどの言語でもほぼ似たような仕様で扱えるかと思います.

Hubに接続する

[csharp] private string url = "http://localhost:29973/signalr"; private async void Init() { connection = new HubConnection(url); proxy = connection.CreateHubProxy("Hub"); await connection.Start(); while (true) { try { sendbutton.IsEnabled = true; textbox.Text = connection.State.ToString(); break; } catch (Exception) { } } } [/csharp]

Hubに接続する場合は, コネクションインスタンスを生成し, HubProxyで, 接続するHubの名前を指定してオブジェクトを生成し, 接続を開始します. 接続は, 非同期に接続するので, 接続完了前にHubの呼び出しを行った場合などに例外が発生するので, このコードでは, 接続完了がわかるようになっています. この部分は, 適宜必要な形にしてください.

Hubのメソッドを呼び出す

[csharp] private void Button_Click(object sender, RoutedEventArgs e) { proxy.Invoke<string>("Search", textbox.Text); } [/csharp]

接続時に生成したHubPorxyオブジェクトのInvokeメソッドを使用し, 第一引数に呼び出すメソッド名, 第二引数にそのメソッドの引数を渡します. 複数引数を渡す場合は, object型配列に渡したいデータを入れて渡します.

Hubから呼び出される

[csharp] private async void Result(string message) { await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () => { textbox.Text = message; } ); } [/csharp]

このメソッドが, Hubから呼び出されるメソッドです. Hubは, このResultメソッドを, 通常のメソッドのように呼び出すことにより, 値を渡すことができます. 呼び出されたメソッドでは, コントロールのスレッドと呼び出されたスレッドが異なるため, コントロールに対して値を渡したい場合は, Dispatcher.RunAsyncを使用してコントロールにアクセスする必要があります.

このコードを見ると, サーバ, クライアントに分かれているのに, 通常のプログラムのメソッド呼び出しのように扱うことができるように見えます. SignalRは, RPC形式のapiを採用しているため, このような操作が可能となっています.

双方向通信は, 何かと難易度が高いように感じられますが, 非常に簡単に実装が可能であるので, プログラムに一つアクセントを加えたい場合に, ぜひ活用してみてください.