【ISimpleSocketTcpServer】

はじめに

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

スキャフォールディング

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

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

インターフェース定義

ISimpleSocketTcpServer インターフェースは、TCPサーバーとして必要な基本的な操作を定義しています。
interface ISimpleSocketTcpServer
{
    public function getSimpleSocketType(): SimpleSocketTypeEnum;
    public function send( string $p_cid, string $p_dat ): ?bool;
    public function recv( ?string &$p_cid ): ?string;
    public function shutdown( string $p_cid ): bool;
    public function logWriter( string $p_level, array $p_param );
}
                    

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

各メソッドの解説


getSimpleSocketType

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

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

send

/**
 * データ送信
 * 
 * @param string $p_cid 接続ID
 * @param string $p_dat 送信データ
 * @return ?bool true(成功) or false(失敗) or null(ダウンタイム中)
 */
                    

  • 任意の接続IDを持つクライアントに対してデータを送信します。
  • 接続IDは recv メソッドでデータを受信した際に取得したものを利用します。
  • 戻り値は送信の成否を示し、ダウンタイム中は null が返ります。

recv

/**
 * データ受信
 * 
 * @param ?string &$p_cid 接続ID
 * @return ?string 受信データ or null(なし)
 */
                    

  • クライアントからのデータを受信します。
  • 受信と同時に、引数 $p_cid に相手の接続IDがセットされます。
  • データが存在しない場合は null が返ります。

shutdown

/**
 * ソケットクローズ
 * 
 * @param string $p_cid 接続ID
 * @return bool true(成功) or false(失敗)
 */
                    

  • 特定のクライアント接続を切断するためのメソッドです。
  • 引数 $p_cid に対象の接続IDを指定すると、その接続をクローズします。
  • 戻り値は処理の成否を示し、true で正常終了、false で失敗を表します。
  • 不要な接続を明示的に切断することで、リソースの効率的な利用やセキュリティ強化に役立ちます。

logWriter

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

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

実装例

以下は、SimpleSocketGenerator::setKeepRunning にクロージャを渡して ISimpleSocketTcpServer を利用する例です。
$generator->setKeepRunning
(
    /**
     * 常時実行処理
     * 
     * @param ISimpleSocketTcpServer $p_simple_socket シンプルソケットインスタンス
     * @param mixed[] $p_argv 可変引数
     * @return void
     */
    function(ISimpleSocketTcpServer $p_simple_socket): void
    {
        // データ受信
        $cid = null;
        $data = $p_simple_socket->recv($cid);

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

        // データ送信(エコーバック)
        $p_simple_socket->send($cid, $data);

        // 接続を切断
        $p_simple_socket->shutdown($cid);
    }
);
                    

この例では、受信したデータをログに出力し、そのままクライアントに送り返した後、接続を切断するシンプルなエコーサーバーを実装しています。

関連リンク