C#でSignalRを使用した通信を行いたい その2(接続) | プログラミングがわからなすぎる

プログラミングがわからなすぎる

気が向いた時の備忘録。プログラミングは好きなのに物凄く単純なものしか理解できないからメモしていくうちに覚えられたらいいな
ターゲットフレームワークは大体4.7.2

C#でSignalRを使用した通信を行いたい その1(準備)」でとりあえず空っぽのプロジェクトは作成した。

ので、とりあえずサーバ側とクライアント側が接続できるか試してみる

サーバとか持ってないからlocalhostでやるよ

 

 

 

クライアント側のプロジェクト 

 

今回処理を書き込んでいくのは、赤枠で囲んだ2つのファイル

 

Windowsフォームアプリケーションを作成したときに初めから自動で作られているForm1.csは

分かりにくいのでとりあえずClientForm.csに名前変更

 

それと接続処理とかをClientForm.csに書きたくなかったため、

プロジェクトにSignalRClientクラスを追加(名前はなんでもいい)

 

フォームに「接続」ボタンと「切断」ボタンを貼り付けておく

 

 ClientForm.cs

using System;
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

using Microsoft.AspNet.SignalR.Client;

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;
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 Microsoft.Owin.Hosting;
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 Microsoft.AspNet.SignalR;
using Owin;

namespace SignalRServerTest
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR(new HubConfiguration());
        }
    }
}

 

 TestHub.cs

using Microsoft.AspNet.SignalR;

namespace SignalRServerTest
{
    public class TestHub : Hub
    {
    }
}

青字にしているクラス名(TestHub)は、

クライアントのSignalRClientクラスに書いてある青字の部分と一緒にする

 

接続してみる 

 

両方のプロジェクトを実行

 

両方とも画面が表示された。

 

まず、サーバ画面の開始ボタンをクリックせずに

クライアントの接続ボタンを押してみる

接続できないみたい。

 

次はサーバの開始ボタンを押してから

クライアントの接続ボタンを押してみる

つながったらしい

 

本当に接続されているか不安なので

次はサーバ側で接続検知ができないか考えてみようと思う