C#でSignalRを使用した通信を行いたい その5(クライアント→サーバにデータを送る) | プログラミングがわからなすぎる

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

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

クライアント側からサーバ側に何かデータを送ってみる

あるあるだけどチャットのようなプログラムを目指すことにしたので

今回はクライアントから名前(string)を送信してみる

 

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

 

 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();
        }

        /// <summary>
        /// 送信ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SendNameButton_Click(object sender, EventArgs e)
        {
            SignalRClient.SendName(NameTextBox.Text);
        }

    }
}

送信ボタンクリックを追加した

画面の送信ボタンをクリックすると、SignalRClientクラスの

SendNameメソッドが実行される

パラメータとして送信ボタン横のテキストボックスの中身を設定する

 

 SignalRClient.cs

using Microsoft.AspNet.SignalR.Client;
using System;

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();
        }

        /// <summary>
        /// 名前送信
        /// </summary>
        /// <param name="name"></param>
        public static void SendName(string name)
        {
            proxy.Invoke("AnnounceSendName");
            proxy.Invoke("GetName", name);
        }

    }
}

SendNameメソッドにサーバのメソッドを呼び出す処理を書く

 

今回は2つのサーバメソッドを呼び出してみる

・AnnounceSendName()

・GetName(string 文字列)

 

サーバ側のプロジェクト 

見た目は前と変わらず

 

 TestHub.cs

using Mirosoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace SignalRServerTest
{
    public class TestHub : Hub
    {
        public void AnnounceSendName()
        {
            FormSet.form.Invoke(new Action<string>(FormSet.form.ShowMessage), 
                "名前が送信されました");
        }

        public void GetName(string name)
        {
            FormSet.form.Invoke(new Action<string>(FormSet.form.ShowMessage), 
                "名前:" + name);
        }


        public override Task OnConnected()
        {
            object a = FormSet.form.Invoke(new Action<string>(
                FormSet.form.ShowMessage), Context.ConnectionId + "が接続しました");
            return base.OnConnected();
        }
        public override Task OnDisconnected(bool stopCalled)
        {
            FormSet.form.Invoke(new Action<string>(
                FormSet.form.ShowMessage), Context.ConnectionId + "が切断しました");
            return base.OnDisconnected(stopCalled);
        }
    }
}
 

Hubクラスに、クライアントから呼び出されるメソッドを実装した

 

AnnounceSendName()が呼び出された場合、青いフォーム画面のテキストボックスに

「名前が送信されました」と表示されるはず

 

GetName()が呼び出された場合、青いフォーム画面のテキストボックスに

「名前:」という文字と、実際に渡されたパラメータの文字列が表示されるはず

 

 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();
        }

        /// <summary>
        /// メッセージ表示
        /// </summary>
        /// <param name="msg"></param>
        public void ShowMessage(string msg)
        {
            MessageTextBox.Text += msg + "\r\n";
        }

    }
}

フォームのほうに設定されているテキストボックスに

貰った文字列を追加して改行するメソッドShowMessage()を作る

 

動かしてみる 

まずどちらも実行して、サーバ側(青いほう)の開始ボタンをクリックする

これでサーバはスタートしたはず

 

接続ボタンをクリックすると、サーバ側に接続したってメッセージが出たし

クライアント側に「接続成功」のメッセージボックスが出たので

接続成功

 

とりあえずクライアントのテキストボックスに

適当な名前を入力して、送信ボタンをクリックしてみる

これでサーバ側に「名前が送信されました」と

「名前:おなまえ」が出てくれば成功

 

成功!

 

 

クライアントからサーバのメソッドを呼び出す書き方メモ 

パラメータを渡さない場合:

 proxy.Invoke("呼び出すサーバのメソッド名");

 

パラメータを渡す場合:

 proxy.Invoke("呼び出すサーバのメソッド名", 送りたい値);

 

複数パラメータを渡す場合:

 proxy.Invoke("呼び出すサーバのメソッド名", 送りたい値1, 送りたい値2)

※proxy:IHubProxy