【ISimpleSocketUdp】

はじめに

SOCKET-MANAGER Framework の新機能「シンプルソケット機能」では、UDP通信用のインターフェースとして ISimpleSocketUdp が用意されています。
本記事はリファレンス的な位置づけとして、インターフェースの定義や各メソッドの役割、利用時のポイントを整理します。
実際のメイン処理クラスの実装ガイドについては ▶UDP 通信の実装 を参照してください。

スキャフォールディング

UDP通信用のシンプルソケットを利用する場合、専用のスキャフォールディングコマンドを使ってメイン処理クラスを生成できます。
> php worker simple:udp MainForTest
                    

このコマンドを実行すると、ISimpleSocketUdp インターフェースを実装するためのメイン処理クラスが生成されます。
生成されたクラスの具体的な実装方法については、▶UDP 通信の実装 を参照してください。

インターフェース定義

ISimpleSocketUdp インターフェースは、UDP通信として必要な基本的な操作を定義しています。
interface ISimpleSocketUdp
{
    public function getSimpleSocketType(): SimpleSocketTypeEnum;
    public function sendto( string $p_host, int $p_port, string $p_dat ): ?bool;
    public function recvfrom( ?string &$p_host, ?int &$p_port ): ?string;
    public function logWriter( string $p_level, array $p_param );
}
                    

このインターフェースを通じて、送受信・ログ出力といったサーバー機能を統一的に扱えます。

各メソッドの解説


getSimpleSocketType

/**
 * シンプルソケットタイプの取得
 * 
 * @return SimpleSocketTypeEnum シンプルソケットタイプ
 */
                    

  • SimpleSocketGenerator クラスのインスタンス化時に指定したソケットタイプを返します。
  • UDP通信用の場合は、常に SimpleSocketTypeEnum::UDP が返却されます。

sendto

/**
 * データ送信
 * 
 * @param string $p_host ホスト
 * @param string $p_port ポート
 * @param string $p_dat 送信データ
 * @return ?bool true(成功) or false(失敗) or null(ダウンタイム中)
 */
                    

  • SimpleSocketGenerator クラスのインスタンス化時に指定した宛先(ホスト名 / ポート番号)に対してデータを送信します。
  • $p_host 引数には相手先のホスト名を、$p_port引数にはポート番号を指定します。
  • 戻り値は送信の成否を示し、ダウンタイム中は null が返ります。

recv

/**
 * データ受信
 * 
 * @param ?string &$p_host ホスト
 * @param ?int &$p_port ポート
 * @return ?string 受信データ or null(なし)
 */
                    

  • サーバーからのデータを受信します。
  • 受信時に $p_host 引数には相手先のホスト名が、$p_port引数にはポート番号が設定されます。
  • データが存在しない場合は null が返ります。

logWriter

/**
 * ログ出力
 * 
 * シンプルソケットで使用しているログ出力と統合される
 * 
 * @param string $p_level ログレベル
 * @param array $p_param ログパラメータ
 */
                    

  • SimpleSocketGenerator::setLogWriter で登録したログライターを利用してログを出力します。
  • SocketManager や RuntimeManager と同じシグネチャのため、既存のログ基盤をそのまま流用可能です。
  • ログレベル(例:debug, info, error)とパラメータを渡すことで、統一された形式でログを記録できます。

実装例

以下は、SimpleSocketGenerator::setKeepRunning にクロージャを渡して ISimpleSocketUdp を利用する例です。
$generator->setKeepRunning
(
    /**
     * 常時実行処理
     * 
     * @param ISimpleSocketUdp $p_simple_socket シンプルソケットインスタンス
     * @param mixed[] $p_argv 可変引数(setKeepRunningメソッドの第二引数以降のものが渡される)
     * @return void
     */
    function(ISimpleSocketUdp $p_simple_socket): void
    {
        // データ受信
        $host = $port = null;
        $data = $p_simple_socket->recvfrom($host, $port);

        // データのログ出力
        $p_simple_socket->logWriter('debug', ['受信データ' => $data]);

        // データ送信
        $p_simple_socket->sendto($host, $port, $data);
    }
);
                    

この例では、受信したデータをログに出力し、そのまま相手先へ送り返すシンプルなエコーサーバーを実装しています。

関連リンク