説明

システムハンドラにルーチンを設定します。

構文
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())に分けて設定しています。

システムハンドラの設定はサーバが開始される前に設定します。