IDRP ver0.3 Internet Dice Roll Protocol(笑)です。 仕様原案 ・クライアントサーバシステムで、クライアントはサーバに「ダイスを振れ」要求を  出し、サーバは結果を各クライアントに送信し、それを受け取った各クライアント  はそれを表示する。 ・表示の仕方はクライアントに依存する。 ・ダイスは最低4、6、8、10、12、20面体と、コイントス(2面体)、D%を  サポートする。 ・255個程度は一気に振れるようにする(実際の表示に関してはクライアント依存)。 ・TCPを使う。 ・キャラクタ指向。命令はテキストで、行単位に区切られる。telnet接続可能。 ・双方向通信。サーバ→クライアント、クライアント→サーバの両方向に任意のタイ  ミングでデータの送信が可能。 ・メッセージの送受信を可能にする。 一般則 ・改行コードはLFのみとする。CRLFはサーバやクライアントで処理する際にLFに変換  するのが望ましい。一応サーバはCRLFが送られてきても対処できるように作る。 ・空白文字は半角スペースもしくはタブの繰り返しとする。 ・日本語コードは基本的にeucを用いる。名前などに日本語を使う場合はクライアント  でeucに変換すること。メッセージは正しくContent-typeを設定すれば何でも可だが、  クライアントがeuc以外をサポートしているかは保証しない。特に、メッセージ以外  (ユーザー名など)はeucのみとする。 ・サーバーのデフォルトポート番号は3962番を使う。 ・現状ではメッセージ本体のバイト数は4095まで。 ・メッセージ 1つのメッセージは次の要素からなる。 読み出す場合は先頭から空白行までをヘッダとして読み込み、Content-lengthの指定 があればそこからさらにContent-lengthバイトを本体として読み込む。 次のメッセージは、そこからInternetDICE 0.2の文字列が現れるまで読み飛ばしたと ころからスタート。 1行目 InternetDICE 0.3 を書く。0.3はバージョン。 InternetDICE 0.1 もしくは InternetDICE/0.1 はver0.1対応のアプリケーションとして受け付ける。 新バージョンは常に旧バージョンの上位互換である。 2行目 toServer(クライアントからサーバーへ) toClient(サーバーからクライアントへ) のどちらかを書く。 3行目 コマンドを書く。コマンドについては後述。 4行目以降 必要ならDate、Server、Client、Content-length、Content-typeのようなヘッダを ずらずら書く。省略も場合によっては許される(実際DateやServer、Clientなんか はチェックしないだろうし)。 本文がある場合はContent-lengthにそのバイト数を書く。 ヘッダと本体の区切りは空白行(本体が無くても必ず空白行を出力すること)。 書式は後述のエンティティ・ヘッダを参照。 同じ項目を2つ以上書いた場合は後者を採用。 空白後に本文を記述する。形式は任意だが、Content-typeで指定したデータとして 受け取られる。 ・エンティティ・ヘッダ 時刻 Date: Sat Feb 14 22:44:22 1998 このフォーマットでメッセージ作成時の時間を出力する。 プログラム Server: ??? もしくは Client: ??? サーバーやクライアントのアプリケーション名とバージョン。 空白やtabを含まない、asciiもしくはeucで。多分チェックしないので、書かなくて もいい。 本体の長さ Content-length: ??? 本体のバイト数。10進数で。 最大4095とする(以後のバージョンで増えるかも知れない)。 省略されるか、0なら本文は無しとして扱う。 本体の内容 Content-type: ???? 将来MIMEに対応するかも知れないが、現状では未対応。????に書く文字は以下を予約 する。 idice/result ダイスロールの結果(SHOWコマンドを参照) idice/text 通常のテキスト(ASCII) idice/sjis ASCII+シフトJIS+半角カナ idice/euc ASCII+euc idice/binary その他 ちなみにサーバーではこの値のチェックはしない。この文字列と、本文をそのまま他 のクライアントに流すだけである。 クライアントでチェックして、必要なら変換等の処置を行うこと。 メッセージID ID: ??? このヘッダがついたメッセージへのレスポンスは、同じIDを付けて返す。 ・クライアント->サーバーコマンド LIST   現在存在するチャネル一覧を要求する。サーバーからの返答はPUTCHANNELコマンド   で送られてくる。 OPEN クライアントのアドレス:ポート ユーザー名   サーバにユーザー名を登録する。OPEN、LIST、CLOSE、GETUSER以外のコマンドは   まずOPENしないと有効にならない。サーバーは登録されている全てのクライアン   トに各種のリクエストを出すことが出来る。   既にOPENされているときに再OPENされた場合はモードを初期化する。登録名の変   更も可。   登録名はユニークなら32バイトまで任意(半角スペース、タブ不可)。日本語はeuc   を使うこと。   アドレスやポートはチェックしないかも知れないが、ちゃんと書こう。   登録できたら応答コード0がレスポンスで返される。 JOIN チャネル名   特定のチャネルに入る。無いなら新たに作る。   同時に複数のチャネルに登録してはならない。その場合、以前入っていたチャネル   からは自動的に抹消される。   同時に複数のチャネルに参加するにはクライアントを複数立ち上げること。   サーバーはユーザーがチャネルに入出するときにそのチャネルに参加しているメ   ンバー全員にPUTUSERコマンドを送る。   チャネル名は32バイトまで(スペース、タブ不可)。#で始まること。日本語はeuc   を使うこと。 CLOSE   サーバーから登録を抹消する。以後リクエストは送られなくなる。   その後TCPコネクションをクローズする。 MODE パラメータ   モードを変更する。パラメータは以下の通り。   +o オープンダイスモード(default)   -o シークレットダイスモード(自分しか結果が見れなくなる。ただしFAKEROLL の結果は全員に通知) +m マスターモード(FAKEROLL使用可) -m プレイヤーモード(default) ROLL x y z w   y面体ダイスをx個振るように要求する。yには2、4、6、8、10、12、   20、100が有効。xは1〜255。   実際のサーバではyも1〜255か〜127であることがほとんどだろうが、一応上記   以外は未保証。   zにはダイスの振り方を指定する。wにはzに応じたパラメータを指定する(0〜127)。   省略時は0  zの値   0 通常   1 どれか1つでも最大値が出たら同じ個数だけ振り直し   2 全部最大値なら振り足し   3 上方無限ロール(1dxなら上5%、それ以外は最大値)   4 下方無限ロール(1dxなら下5%、それ以外は最低値)   5 上下無限ロール(1dxなら上下5%、それ以外は最大、最小値)   6 どれか1つが最低値なら振り足し   7 T&Tバーサーク     w=0 バーサークできない場合に最低値に揃える     w=1 揃えない   8 全部最低値なら振り足し   9 全部同じ目なら振り足し 10 最大値が出たダイスだけ振り足し     w=0以外 ダイス目がy-w以上の時振り足す   11 最低値が出たダイスだけ振り足し SENDMESG 相手のユーザー名[ 相手のユーザー名・・・]   相手にメッセージを送る。メッセージ本体はエンティティ・ボディに書く。複数   名に同時に送れる。相手に*を書くと同じチャネルにいる全員に送る。   相手を直接指定すれば違うチャネルにいる相手やチャネルに入っていない相手に   も送れる。   サーバは指定された相手にSHOWMESGコマンドで全く同じメッセージを配信する。   なお、自分には必ず送り返されてくる。 GETUSER   現在サーバーに登録されているメンバーのリストを要求する。   サーバはPUTUSERコマンドで結果を返す。 READY マジックナンバー   サーバーに応答を要求する。しばらく反応がなかったら自動的にクローズするの   がいい。   マジックナンバーは適当な値(0〜65535)。 RESPONSE 応答コード マジックナンバー   サーバーからの命令(主にREADY)への応答。マジックナンバーはREADYコマンドで   送られてきたもの。応答コードは後を参照。 REROLL x y z w   ダイスを振り直す。もとのダイス目はidice/result形式でエンティティ・ボディ   に書く。x、y、z、wの意味はROLLと同じ。最後の0より先のダイス目をその時振   ったものとして、以後の振り足しなどの処理を行う。   xやyに対して矛盾するデータの場合、適切に変換する(最大値をyにし、数をx個   に切り詰める)。   z=0の場合、エンティティ・ボディのダイス目をそのまま表示する。 FAKEROLL x y z w   ダイスを振ったものとして扱う。マスターモード時のみ有効。ダイス目はidice/   result形式でエンティティ・ボディに書く。x、y、z、wの意味はROLLと同じ。   エンティティ・ボディをそのままSHOWコマンドで返す。 ・サーバー->クライアントコマンド SHOW x y ユーザー名 z w   ユーザーが、y面体ダイスをx個振った結果を表示するように要求。実際のダイ   ス目はエンティティ・ボディに1行1つで書かれる。   クライアントからのROLLコマンドが受理されたときに同チャネルにいる各クライ   アントに発信される。   zは振り方を指定したフラグ。ROLLコマンド参照。   wはzに応じたパラメータだが、REROLLコマンドに対するSHOWの場合+128される。 SHOWMESG 送り主   送られてきたメッセージを配信する。メッセージ本体はエンティティ・ボディに   書く。   クライアントからのSENDMESGコマンドが受理されたときに各クライアントに発信   される。   それ以外でも送り主がserverとなるサーバーメッセージもある。 PUTUSER   現在サーバーに登録されているユーザー一覧を送る。実際のユーザー一覧はエン   ティティ・ボディに1行1人で書かれる。   登録名 参加チャネル そのアドレス:ポート 属性   属性は、プレイヤーモードなら0、マスターモードなら1。   ユーザーのチャネルへの出入りがあったときにそのチャネルにいるユーザー全員   に、GETUSERコマンドが送られてきたときに対象のユーザーに発信される。 PUTCHANNEL   現在存在するチャネル一覧を送る。LISTコマンドへの返答として送られる。 READY マジックナンバー   クライアントに生き死にを判断するべく送る。クライアントから一定回数のリト   ライを行ってもレスポンスが無い場合は自動的にCLOSEする。   マジックナンバーは適当な値(0〜65535)。   クライアントが要求を受け付ける余裕があるかを調べるためにSHOWなどの前に   READYコマンドを送って確認することも考慮しておきたい。 RESPONSE 応答コード マジックナンバー   クライアントからのコマンド(主にREADY)への応答。   マジックナンバーはREADYコマンドで送られてきたもの。応答コードは後を参照。 ・応答 コマンドへの返答としてRESPONSEコマンドで送られるべき応答。 斜線の後は応答コードの意味だが、省略可。書いてもいい。 100/OK 問題ないことを示す。 101/Illegal Command  コマンドが不正。 102/Illegal Parameter コマンドのパラメータが不正。 200/Not Open 登録されていない。 201/Not Join チャネルに入っていない。 202/Duplicate Name 登録しようとしたユーザー名は既に使われている。 300/Busy Now 現在作業中で新たなコマンドの受理が出来ない。 301/Not Accept  コマンドを受け入れるつもりはない。 ちなみにREADYコマンド以外のコマンドに対しても必要に応じてRESPONSEコマンドは 発行されうる。READYコマンドはRESPONSEコマンドの発行を促すコマンドと考えて貰 えばいい。 以下は指針。 クライアントからサーバーへのコマンドに対する返答  登録されていない時に登録が必要なコマンドを受けたら200を返す。  チャネルに入っていないときにROLLコマンドを受けたなら201を返す。  要求を受け入れるつもりが無いなら301を返す。  エラーがあるなら100番台を返す。  そうでないなら000を返す。 それに対するクライアントの対応  登録したはずなのに200を受け取ったら登録状態を解消する。  301を受け取ったら登録状態を解消する。  100番台を受け取ったらクライアント側で適切な処置をとる。  一定時間応答がない場合はREADYコマンドを発行する。一定回数発行しても000が返  ってこないなら一応CLOSEコマンドを発行し、回線を切る。 サーバーからクライアントへのコマンドに対する返答  要求を受け入れるつもりが無いなら301を返す。  忙しくて受理出来ないなら300を返す。  そうでないなら000を返す。 それに対するサーバの対応  300を受け取ったら即座にCLOSEする。  301を受け取ったらしばらく待ったあと、直前のコマンドを再送信する。  一定時間応答がない場合はREADYコマンドを発行する。一定回数発行しても000が返  ってこないならCLOSEし、回線を切る。