~~NOTOC~~ ---json { "title":"setsyshandler()", "description":"システムハンドラにルーチンを設定します" } --- \\ ====== setsyshandler() ======
==== 説明 ==== システムハンドラにルーチンを設定します。\\ ==== 構文 ==== setsyshandler( handler_name, func ) ==== 引数 ==== handler_name : ハンドラ名 ^ ハンドラ名 ^ ルーチン呼び出しの条件 ^ | onConnect | 新たなノードが接続したとき | | onDisconnect | 接続するノードがユーザによる要求または何らかの理由で切断されたとき | | onRecv | 接続するノードからデータを受信したとき | | onSend | 関数send()が呼び出されたとき | | Input(*) | サーバ処理(Serve)の入力処理(Input)が行われるとき | | Output | サーバ処理(Serve)の出力処理(Output)が行われるとき | | SysWork(*) | サーバ処理(Serve)のアプリケーションシステム処理(SysWork)が行われるとき | ※ ハンドラ名の指定は大文字小文字は区別する必要はありません。\\ ※ SysWork, Inputハンドラは、代替処理が可能なため廃止予定です。\\ func : ルーチン ==== 返り値 ==== ありません。\\ ==== 備考 ==== Input, Output, onRecv, onSendの各ハンドラは、設定できるルーチンがそれぞれ1つ、 onConnect, onAccess, onDisconnect, SysWorkの各ハンドラは、それぞれ、複数のルーチンを設定することができます。\\ ハンドラルーチンを定義するときは、BBSオブジェクトを受け取るようにします。\\ package App; my $bbs = new BBS; # BBS.pm オブジェクトを作成 sub syshandler { my $self = shift; # 受け取った BBS.pm オブジェクト $self->send('senddata'); } また、ハンドラを設定するときは、BBSオブジェクトがハンドラに渡るようにします。\\ $bbs->setsyshandler( 'handler', sub { $bbs->App::syshandler(@_) } ); 複数設定可能なハンドラ( onConnect, onAccess, onDisconnect, SysWork )は設定ルーチンの重複チェックは行っていないため、重複して設定すると繰り返し呼び出されることなるので、設定する際は注意してください。\\ 複数設定可能なハンドラ( onConnect, onAccess, onDisconnect, SysWork )では、呼び出すルーチンの順序を管理していないため、ハンドラを呼びしたときに決まった順序でルーチンが呼び出されない場合があります。従って、ルーチンの呼び出し順に関わるような処理を行うことはできません。\\ ==== 用例 ==== クライアントが接続、切断したときにメッセージを表示します。\\ package App; use BBS; my $bbs = new BBS; # ●接続するノードにメッセージを表示 sub onconnect { my $self = shift; printf "接続しました (%d)\n", $self->from(); } # ●切断するノードにメッセージを表示 sub disconnect { my $self = shift; printf "切断しました (%d)\n", $self->from(); } # ●接続するノード一覧を表示 sub disconnect2 { my $self = shift; my @n = $self->nodes(); printf "接続ノード : [ %s ]\n", join( ', ', @n ); } # ●システムハンドラを設定 $bbs->setsyshandler( 'onConnect', sub { $bbs->App::onconnect() } ); $bbs->setsyshandler( 'onDisconnect', sub { $bbs->App::disconnect() } ); $bbs->setsyshandler( 'onDisconnect', sub { $bbs->App::disconnect2() } ); # ●サーバを開始 $bbs->start(8888); このコードではノードが接続したときに接続したノード番号を表示し、ノードが切断したときは切断したノード番号とサーバに接続しているクライアントの一覧を表示します。\\ onDisconnectハンドラは複数設定可能のハンドラですので、切断するクライアントの番号を表示する処理(disconnect())とサーバに接続するクライアント一覧を表示する処理(disconnect2())に分けて設定しています。\\ システムハンドラの設定はサーバが開始される前に設定します。\\
~~DISCUSSION~~