C#によるソケット通信(準備編)

ネットワーク

TCP/IPを使ってソケット通信でPC間のデータ通信を行います。
これにより、ネットワークを介して直接対象のPCにデータを送受信することができます。

ソケット通信をするためには、IPアドレスとポート番号が必要になります。

ソケット通信は、複数の端末とのやり取りや待ち状態でソフトが止まってしまわないように非同期通信でやるのがよいかと思います。

非同期通信であれば、結果が返る前に一度処理を抜けます。その後処理が終わると指定した変数に結果が返ってきます。

今回、この記事のためにサンプルプログラムをGitHubに用意しました。

GitHub - nomux2/SampleSocketConnection
Contribute to nomux2/SampleSocketConnection development by creating an account on GitHub.

ソケット通信の流れ

ソケット通信の場合リスナーとクライアントに分かれます。
仮にPC1をリスナー(親)、PC2をクライアント(子)とします。

  1. PC1がリスナーを起動し、PC2のクライアントからの接続を待つ状態にします。
  2. PC2のクライアントからPC1のリスナーに接続をします。
  3. PC1、またはPC2からデータを送信および受信します。
  4. データ通信が完了したら、ソケット通信を終了します。

データ通信におけるさまざまなCallBack関数

CallBack関数とは、何らかの処理が終わったら呼び出される関数のことを指します。

ソケット通信では非同期通信で処理を行った際、結果を返すのにCallBack関数を使用します。
以下に主に利用される非同期通信の関数を表にまとめてみました。

CallBack関数名説明備考
BeginAccept接続の受け入れ待ち状態にするリスナー側で使用します。
BeginConnect接続開始します。クライアント側で使用します。
BeginDisconnect接続を切ります。
BeginReceiveデータの受信待ち状態にします。
BeginSendデータを送信します。

例えばリスナーが待ち状態のときに、クライアントから接続されると呼び出されます。
ただし、CallBack関数では、マルチスレッドになっていることがよくあります。

メインのフォームなどを見ているスレッドとは違うスレッドになるのでCallBack関数でフォームのコントロールを操作しようとするとエラー落ちます。

ソケット通信のCallBack関数については、リスナー編、クライアント編で説明します。

非同期通信時に渡すパラメータ

今回、非同期通信をするときに、リスナーとクライアントでやり取りを行うパラメータがあります。

object型なのでなんでも使えます。ここでは、送受信用のデータと通信に利用したソケットを格納しておきます。他にもユーザー名などを入れておけばチャットなどのツールに利用できるかと思います。

/// <summary>
/// 通信時に付随する情報
/// </summary>
public class SocketStateClass
{
    //送受信用バッファ
    public byte[] Buffer { set; get; } = null;

    //Encording
    public Encoding Encoding { set; get; } = System.Text.Encoding.UTF8;

    // ソケット
    public Socket WorkSocket { set; get; } = null;

    //文字列の取得
    public string GetString()
    {
        return Encoding.GetString(Buffer, 0, Buffer.Length);
    }
}

まとめ

以前ユーザーから機器の情報をリアルタイムで画面に表示したいということで、機器について説明書を読んだりメーカーに問い合わせをしたところ、CSVファイルをFTP送信するかソケット通信ができますとのことでした。

CSVファイルをFTP送信するということはFTPの受信処理、ファイルの読込処理、ファイルの退避処理ということでそれぞれがリソースを喰いそうで、リアルタイムでサーバー負荷が掛かることが予想されたため、ソケット通信という手段を用いました。その時の環境は以下のようになります。

こんな感じですが、サーバーがリスナーになります。機器とユーザーはソケット通信のクライアントとして設定しました。接続してきた端末からはIPアドレスが取得できますので機器のIPアドレスをサーバーに保存しておき、機器からのソケット通信はデータを取得します。ユーザーからのソケット通信は機器から受け取った情報を返すように条件分岐しました。

この記事が皆様のお役に立てたら幸いです。

タイトルとURLをコピーしました