【ISimpleSocketTcpServer】
はじめに
SOCKET-MANAGER Framework の新機能「シンプルソケット機能」では、TCPサーバー用のインターフェースとして ISimpleSocketTcpServer が用意されています。
本記事はリファレンス的な位置づけとして、インターフェースの定義や各メソッドの役割、利用時のポイントを整理します。
実際のメイン処理クラスの実装ガイドについては ▶TCP サーバーの実装 を参照してください。
本記事はリファレンス的な位置づけとして、インターフェースの定義や各メソッドの役割、利用時のポイントを整理します。
実際のメイン処理クラスの実装ガイドについては ▶TCP サーバーの実装 を参照してください。
スキャフォールディング
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);
}
);
この例では、受信したデータをログに出力し、そのままクライアントに送り返した後、接続を切断するシンプルなエコーサーバーを実装しています。