「C#でSignalRを使用した通信を行いたい その1(準備)」でとりあえず空っぽのプロジェクトは作成した。
ので、とりあえずサーバ側とクライアント側が接続できるか試してみる
サーバとか持ってないからlocalhostでやるよ
クライアント側のプロジェクト
今回処理を書き込んでいくのは、赤枠で囲んだ2つのファイル
Windowsフォームアプリケーションを作成したときに初めから自動で作られているForm1.csは
分かりにくいのでとりあえずClientForm.csに名前変更
それと接続処理とかをClientForm.csに書きたくなかったため、
プロジェクトにSignalRClientクラスを追加(名前はなんでもいい)
フォームに「接続」ボタンと「切断」ボタンを貼り付けておく
ClientForm.cs
using System.Windows.Forms;
namespace SignalRClientTest
{
public partial class ClientForm : Form
{
public ClientForm()
{
InitializeComponent();
}
/// <summary>
/// 接続ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ConnectButton_Click(object sender, EventArgs e)
{
bool result = SignalRClient.Connect();
if (result)
MessageBox.Show("接続成功");
else
MessageBox.Show("接続失敗");
}
/// <summary>
/// 切断ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DisConnectButton_Click(object sender, EventArgs e)
{
SignalRClient.DisConnect();
}
}
}
「接続」ボタン押下のイベントを作成しておく。
ボタンを押下するとSignalRClientクラスのConnect()メソッドが呼ばれる
SignalRClient.cs
namespace SignalRClientTest
{
class SignalRClient
{
private static HubConnection hub;
private static IHubProxy proxy;
private const string URL = "http://localhost:8088";
private const string HUB_CLASS = "TestHub";
/// <summary>
/// 接続処理
/// </summary>
/// <returns>結果 true:成功 false:失敗</returns>
public static bool Connect()
{
try
{
hub = new HubConnection(URL);
proxy = hub.CreateHubProxy(HUB_CLASS);
hub.Start().Wait(); // 接続実行
}
catch
{
// 接続失敗
return false;
}
return true;
}
/// <summary>
/// 切断処理
/// </summary>
public static void DisConnect()
{
hub?.Stop();
hub?.Dispose();
}
}
}
サーバがちゃんと準備できている場合は
黄色く塗った「localhost」の部分はサーバのIPアドレスにすればOK
今回はサーバを用意しないのでlocalhostで実行する
サーバ側のプロジェクト
今回処理を書き込んでいくのは、赤枠で囲んだ4つのファイル
本当はWindowsサービスやコンソールアプリとか使うのだろうけど
見やすいから今回はサーバ側のプログラムもWindowsフォームアプリケーションにした
勝手に作られていたForm1.csをServerForm.csに改名。
フォームに「開始」ボタンを貼り付けておく
とりあえず以下のクラスをプロジェクト配下に追加した
・SignalRHost(名前はなんでもいい。サーバの開始とか停止を書くために作ったクラス)
・Startup(※大事かも)
・TestHub(名前はなんでもいい。そのうちちゃんと使う)
ServerForm.cs
using System.Windows.Forms;
namespace SignalRServerTest
{
public partial class ServerForm : Form
{
private SignalRHost server;
public ServerForm()
{
InitializeComponent();
}
/// <summary>
/// 開始ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OpenButton_Click(object sender, EventArgs e)
{
server = SignalRHost.signalRHost;
server.Start();
}
/// <summary>
/// フォームを閉じる
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ServerForm_FormClosed(object sender, FormClosedEventArgs e)
{
server.Stop();
}
}
}
「開始」ボタン押下イベントと、画面を閉じるイベントを用意する
「開始」ボタン押下でサーバを開始し、画面を閉じるときにサーバを終了する
SignalRHost.cs
using System;
namespace SignalRServerTest
{
class SignalRHost
{
public static SignalRHost signalRHost = new SignalRHost();
private IDisposable server;
/// <summary>
/// 開始
/// </summary>
public void Start()
{
server = WebApp.Start<Startup>("http://localhost:8088");
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
server?.Dispose();
}
}
}
サーバ開始と停止の動作を書いておく
こちらはオープンして、接続されるのを待っているだけなので
接続URLはlocalhostのままで良いはず
ポート番号(8088、任意のポート番号)は、クライアントと合わせる
Startup.cs
using Owin;
namespace SignalRServerTest
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR(new HubConfiguration());
}
}
}
TestHub.cs
namespace SignalRServerTest
{
public class TestHub : Hub
{
}
}
青字にしているクラス名(TestHub)は、
クライアントのSignalRClientクラスに書いてある青字の部分と一緒にする
接続してみる
両方のプロジェクトを実行
両方とも画面が表示された。
まず、サーバ画面の開始ボタンをクリックせずに
クライアントの接続ボタンを押してみる
接続できないみたい。
次はサーバの開始ボタンを押してから
クライアントの接続ボタンを押してみる
つながったらしい
本当に接続されているか不安なので
次はサーバ側で接続検知ができないか考えてみようと思う