【ISimpleSocketUdp】
はじめに
SOCKET-MANAGER Framework の新機能「シンプルソケット機能」では、UDP通信用のインターフェースとして ISimpleSocketUdp が用意されています。
本記事はリファレンス的な位置づけとして、インターフェースの定義や各メソッドの役割、利用時のポイントを整理します。
実際のメイン処理クラスの実装ガイドについては ▶UDP 通信の実装 を参照してください。
本記事はリファレンス的な位置づけとして、インターフェースの定義や各メソッドの役割、利用時のポイントを整理します。
実際のメイン処理クラスの実装ガイドについては ▶UDP 通信の実装 を参照してください。
スキャフォールディング
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);
}
);
この例では、受信したデータをログに出力し、そのまま相手先へ送り返すシンプルなエコーサーバーを実装しています。
関連リンク
- SimpleSocketGenerator クラスのリファレンス
-
新規開発環境での実装ガイド
このページの実装例では TCP サーバーをモデルにしていますが、UDP 通信の実装時でも基本的な手順は同じです。
-
DevOps 環境での実装ガイド
このページの実装例では TCP サーバーをモデルにしていますが、UDP 通信の実装時でも基本的な手順は同じです。