naoit0
ブログ
プロジェクト
BBS.pm
BIG-Model
メモ
Search Term
文書の過去の版を開いています
。もしこのまま保存すると、この文書が最新となります。
メディアファイル
{{tag> projects:bbs_pm:manual}} ---json { "title":"メインプログラムの作り方", "description":"メインプログラムの作り方" } --- ====== メインプログラムの作り方 ====== \\ ===== はじめに ===== ここではメインプログラムの作り方について説明します。\\ BBS.pmはイベント駆動システムでイベントが発生するとイベントに連動してハンドラが呼び出されます。\\ 呼び出されるハンドラに処理ルーチンを設定することでアプリケーションサーバを作成することができます。\\ BBS.pmの制約はごくわずかですので、自由なコードスタイルでメインプログラムを作成することができますが、ひな形を使うことで簡単に作成することができます。\\ 以下はメインプログラムのひな形です。\\ <code perl> package App; use BBS; my $bbs = new BBS; sub onconnect { my $self = shift; $self->setapphandler( sub { $self->App::appWork(@_) } ); } sub ondisconnect { my $self = shift; } sub onrecv { my $self = shift; my $recvdata = shift; } sub onsend { my $self = shift; my $senddata = shift; } sub output { my $self = shift; return $senddata; } sub appwork { my $self = shift; } $bbs->setsyshandler('onConnect', sub { $bbs->App::onconnect(@_) }); $bbs->setsyshandler('onDisconnect', sub { $bbs->App::ondisconnect(@_) }); $bbs->setsyshandler('onRecv', sub { $bbs->App::onrecv(@_) }); $bbs->setsyshandler('onSend', sub { $bbs->App::onsend(@_) }); $bbs->setsyshandler('Output', sub { $bbs->App::output(@_) }); $bbs->start(8888); </code> メインプログラムでは以下の4つの手順を行います。\\ <blockquote > (1) [[#bbspmのロードとオブジェクト作成|BBS.pmのロードとオブジェクトの作成]]\\ (2) [[#各ハンドラで実行するルーチンの定義|各ハンドラで実行するルーチンの定義]]\\ (3) [[#実行するルーチンのハンドラ設定|実行するルーチンのハンドラ設定]]\\ (4) [[#サーバ開始|サーバ開始]]\\ </blockquote> \\ ===== (1) BBS.pmのロードとオブジェクト作成 ===== BBS.pmはメインプログラムから <code perl> use BBS; my $bbs = new BBS; </code> とすることでロードされ、作成したオブジェクトに対して命令を行うことでサーバアプリケーションを操作します。\\ \\ ===== (2) 各ハンドラで実行するルーチンの定義 ===== 各イベントに対する処理(ルーチン)を定義します。\\ 定義するルーチンはBBS.pmのパッケージ(BBS)から呼び出されますので、第一引数にはBBS.pmオブジェクトが渡ります。\\ Perlでは関数(メソッド)を定義する際、習慣的に第一引数の変数名を$selfとすることがありますが、この$selfにBBS.pmオブジェクトが入りますのでルーチン内でBBS.pmに対して命令を行う場合は、 <code perl> $self->function() </code> とします。 ルーチンを定義するときの関数名について制約はありませんが、登録するハンドラ名を使用するのが適切です。\\ <code perl> sub onconnect { my $self = shift; : } </code> onSendハンドラでは関数send()の引数である送信データの引き渡しが行われますので第二引数の指定が必要です。\\ <code perl> sub onsend { my $self = shift; my $data = shift; # 送信データ : } </code> またonRecvハンドラではonAccessイベント処理で取得した受信データの引き渡しが行われますので第二引数の指定が必要です。\\ <code perl> sub onrecv { my $self = shift; my $data = shift; # 受信データ : } </code> そのほか、Outputハンドラではノードにデータを送出するための専用ハンドラです。\\ 送出するデータをハンドラの返り値にセットしてハンドラを抜けることで、ノードにデータが送出されます。\\ <code perl> sub output { my $self = shift; return $senddata; # 送信データ } </code> 用法や注意事項など、詳しくは[[003|ハンドラ]]のページをご覧ください。\\ \\ ===== (3) 実行するルーチンのハンドラ設定 ===== 定義したルーチンをハンドラに設定するときは関数[[..:note:start|setsyshandler()]]で <code perl> $bbs->setsyshandler( 'onConnect', sub { $bbs->App::onconnect() } ); </code> のようにします。\\ ルーチンの設定はメインプログラム(のパッケージ上)で行いますので、作成したBBS.pmオブジェクトの変数(ここでは$bbs)に対して命令を行うことに注意してください。\\ onSend, onRecvハンドラでは通信データの引き渡しが行われますので、ルーチン内で通信データが受け取れるよう、 <code perl> $bbs->setsyshandler( 'onSend', sub { $bbs->App::onsend( @_ ) } ); </code> や <code perl> $bbs->setsyshandler( 'onRecv', sub { $bbs->App::onrecv( @_ ) } ); </code> のように引数を渡すように指定します。\\ 他のハンドラでは引数によるデータの受け渡しは行われませんので引数の指定を省略できますが、全てのハンドラ設定をonSend, onRecvハンドラの設定と同じようにすることで、データの引き渡しが行われないミスを防ぐことができます。\\ \\ ===== (3) サーバの開始 ===== ハンドラ設定が概ね完了すれば、\\ <code perl> $bbs->start(8888); </code> とすることでサーバが開始し、ノードからの着信を待機します。\\ \\ ===== 最後に ===== ハンドラに設定するルーチンは別のパッケージで定義しておき、ハンドラ設定を行うときに別のパッケージにあるルーチンを指定すれば、メインプログラムは <code perl> use App; use BBS; my $bbs = new BBS; $bbs->setsyshandler('onConnect', sub { $bbs->App::onconnect(@_) }); $bbs->setsyshandler('onDisconnect', sub { $bbs->App::ondisconnect(@_) }); $bbs->setsyshandler('onRecv', sub { $bbs->App::onrecv(@_) }); $bbs->setsyshandler('onSend', sub { $bbs->App::onsend(@_) }); $bbs->setsyshandler('Output', sub { $bbs->App::output(@_) }); $bbs->start(8888); </code> とするだけで完成します。\\ また、アプリケーションの規模が小規模で1つのファイルに収めたい場合は、前述のように全てのハンドラ処理の定義とハンドラ設定をメインプログラム上で行うことも可能です。\\ コードスタイルは作成するサーバアプリケーションの規模によって決めておくことで、メンテナンスなどの負担を減らすことができます。\\ ~~DISCUSSION~~
人間の証明として、ボックス内の全ての文字を入力してください。
T T N G X
この項目は空のままにして下さい:
保存
プレビュー
キャンセル
編集の概要
User
ログイン
Page
文書の表示
Manage the slots
以前のリビジョン
Backlinks
Metadata Manager
Page Quality
文書の先頭へ
Website
最近の変更
メディアマネージャー
Recent Pages Visited
サイトマップ
Railbar
User
ログイン
Page
文書の表示
Manage the slots
以前のリビジョン
Backlinks
Metadata Manager
Page Quality
文書の先頭へ
Website
最近の変更
メディアマネージャー
Recent Pages Visited
サイトマップ