Skip to content

「高速会話プロトコル・インターフェース」(FACHPI: Fast Chat Protocol/Interface)の参考実装。開発者のプログラミング学習目的で開発されたものであり、実用性は全く無い。

License

Notifications You must be signed in to change notification settings

Takym/FastChatProtocolInterface

Repository files navigation

FACHPI: Fast Chat Protocol/Interface

高速会話プロトコル・インターフェース

Copyright (C) 2023 Takym.

概要

このツールは、単純な機能しか持っておらず、文字列(平文)の送受信のみを行います。 独自の通信プロトコルを用いているため、他のアプリケーションとは互換性がありません。 全てのクライアントは必ずサーバーを介して通信します。

「FACHPI」は「ファクパイ」と読みます。 「SIFOSC」は「シフォスク」と読みます。

使用方法

ビルド方法

  1. .NET 8 をインストールしてください。
  2. このリポジトリをクローンしてください。
    • git clone https://github.com/Takym/FastChatProtocolInterface.git
  3. 作業ディレクトリを FastChatProtocolInterface へ移動してください。
    • cd FastChatProtocolInterface
  4. ビルドしてください。
    • dotnet build

実行方法

  1. 「ビルド方法」と同等の方法でクローンされているものとします。
  2. 作業ディレクトリを FastChatProtocolInterface\bin\Debug\net8.0 へ移動してください。
    • cd FastChatProtocolInterface\bin\Debug\net8.0
    • ビルド設定を変更した場合、別のディレクトリに出力されている可能性があります。
  3. 実行してください。
    • fachpi -v -h
    • fachpi -m server [オプション...]
    • fachpi -m client -n <ホスト名> -p <ポート番号> [オプション...]

コマンド行引数

  1. 最新の説明書を表示するにはこの方法を試してください。
  2. 「ビルド方法」と同等の方法でクローンされているものとします。
  3. 下記のコマンドを実行してください。
    • dotnet run --project FastChatProtocolInterface -- -v -h
  4. 下記の様な説明書が表示される筈です。
    FACHPI: Fast Chat Protocol/Interface
    Copyright (C) 2023 Takym.
    
    バージョン:0.1.1.0
    
    FACHPI コマンド行引数説明書
    ===========================
    
    使用法> fachpi [オプション...]
    使用法> fachpi -m server [オプション...]
    使用法> fachpi -m client -n <ホスト名> -p <ポート番号> [オプション...]
    
    使用例> fachpi -m server -p 1024 -u "God" [オプション...]
    使用例> fachpi -m client -n 192.168.0.2 -p 1024 [オプション...]
    使用例> fachpi -m client -n 127.0.0.1 -p 48000 -u "Hoge" [オプション...]
    
    オプション一覧
    長い形式        短い形式  説明
    /Version        -v        バージョン情報を表示する。
    /Help           -h        この説明書を表示する。
    /NoLogo                   題名と著作権情報の表示を抑制する。
    /ExecutionMode  -m        実行モードを指定する。大文字と小文字は区別される。
                              サーバーの場合は、server を指定する。
                              クライアントの場合は、client を指定する。
                              下記に完全な実行モードの一覧を記す。
    /HostName       -n        ホスト名を指定する。
                              この値はクライアントの場合のみ使用される。
    /Port           -p        ポート番号を指定する。
                              クライアントの場合は必ず指定しなければならない。
    /UserName       -u        利用者の表示名を指定する。
    
    実行モード一覧
    モード名 説明
    server   最適なサーバーを起動する。
    fachpi   通常のサーバーを起動する。如何なる拡張機能も使用しない事を強制する。
    sifosc   SIFOSC 機能を有効にしてサーバーを起動する。
    client   クライアントを起動する。
    repl     サーバーを起動せずに SIFOSC を実行する。
    
    注意:幾つかのオプションにはこの説明書に記載されていない別表記があります。
    

利用規約

MITライセンスに従うものとします。 必ず遵守してご利用ください。

SIFOSC: Simple Formula Script(単純な数式スクリプト)

FACHPI サーバー上で実行されるスクリプト言語です。 以下に記述例を示します。

[
	[ null, allobj, true, false, newobj, 123 ],
	[ null, newobj, 123, +456, -789, [ ] ],
	[ 1, 2, 3 ] + [ 2 + 2, 5, 2 * 3 ] + [ 1 + 2 * 3 ],
	+-+-+-+100,
	([([([])])]),
	1 + ((1 + 2) * 3 + 1) / 2 % 3 - 4,
	[
		true | false & true ^ false,
		(true | false) & (true ^ false) & false,
		!(((3 & 5) + (3 | 5) + (3 ^ 5)) - (3 & 5 + 3 | 5 + 3 ^ 5)),
		!!true,
		!!0,
		!!123,
		!!!false
	],
	[ allobj.0, allobj.1.1.3 ].1
];

ただし、コンソール画面から入力する時は改行できませんので、下記の様に入力してください。

[[null,allobj,true,false,newobj,123],[null,newobj,123,+456,-789,[]],[1,2,3]+[2+2,5,2*3]+[1+2*3],+-+-+-+100,([([([])])]),1+((1+2)*3+1)/2%3-4,[true|false&true^false,(true|false)&(true^false)&false,!(((3&5)+(3|5)+(3^5))-(3&5+3|5+3^5)),!!true,!!0,!!123,!!!false],[allobj.0,allobj.1.1.3].1];

名称の由来

日本語:「高速会話プロトコル・インターフェース」

単純に文字列を送受信するのみのプロトコルである為、高速に実行する事ができます。 しかし、それ以外の特別な事は一切しません。これが名称の「高速」の由来となります。 文字列の送受信ができれば、少なくとも日常的な「会話」を行う事ができると考えました。 「プロトコル」は通信手順を意味し、「インターフェース」は文字列の送受信を行う為のプログラム上の界面(interface)を意味します。 「プロトコル」と「インターフェース」の間には必ず中黒(・)が挟まれます。 よって、「インターフェース」の延べ棒の個数を変えたり、別の表記にしたりしないでください。 例えば「高速会話プロトコルインターフェース」や「高速会話プロトコル・インタフェイス」等は誤表記になります。

英語:「Fast Chat Protocol/Interface」

それぞれ「Fast」は「高速」、「Chat」は「会話」、「Protocol」は「プロトコル」、「Interface」は「インターフェース」の訳語です。 正式な表記は「Protocol/Interface」であり、日本語と同様に他の表記は許されません。 例えば「Protocol Interface」や「Protocol-Interface」等は誤表記になります。 余談ですが、先に英語名称を決めてから、日本語名称を考えました。

略称:「FACHPI」

上記の名称は長いので、文脈次第では省略する事ができます。 ただし、略称を使う前に必ず正式名称も明記する様にしてください。 略称は英語の頭文字を取って「FACHPI」とし、基本的には全て大文字で表記するものとします。 日本語読みは「ファクパイ」とし、基本的には全てカタカナで表記するものとします。 ただし、プログラムの内部表現や文字の種類に制限がある時などは、他の表記も許容するものとします。 尚、略称には「/」は付けません。

「FCPI」は声に出して読み難く、また、他の略語と被る可能性が高いので却下しました。 日本語の頭文字を取って「高会プロイン」という略語も思い付きましたが、語感が悪く感じたので、こちらも却下しました。 これらの却下した略称は絶対に使わないでください。

日本語:「単純な数式スクリプト」

この名称は複雑な機能を持たせないという意思を表しています。 また、数式機能に重きを置いています。

英語:「Simple Formula Script」

FACHPI と同様に、先に英語名称を決めてから、日本語名称を考えました。 名称の意味は日本語と同じです。

略称:「SIFOSC」

FACHPI と同様に「単純な数式スクリプト」にも略称を付ける事にします。 略称は英語の頭文字を取って「SIFOSC」とし、基本的には全て大文字で表記するものとします。 日本語読みは「シフォスク」とし、基本的には全てカタカナで表記するものとします。 「SFS」と略した場合、非常に曖昧になってしまう恐れがあるので、「FCPI」と同様に却下しました。 「単数ス」という略称も、「高会プロイン」と同じく語感が悪いので却下します。 そもそも「単数」という言葉と非常に紛らわしく感じます。

通信の仕組み

詳細な仕様はソースコードを確認してください。

用語

以下、ネットワーク理論におけるノードは「接点」と表記します。

概要

FACHPI は TCP を用いて通信を行います。 制御やイベント通知には全て TCP を用いています。 しかし、角接点間の同期などの処理は行っていません。 また、中央サーバーが存在し、全てのクライアントはサーバーを介して通信を行います。 サーバーは複数のクライアントと通信できますが、クライアントは一つのサーバーとのみ通信できます。 内部的には IPv4 を用いて通信する様に実装していますが、IPv6 も使用できる様です。

セッションの確立

  1. サーバーを起動すると、複数のクライアントからの接続を待機します。
  2. TCP のセッションが確立し、クライアントがサーバーへの接続を試みると、サーバーとクライアントで下記の署名を相互に送信します。
    0x46, 0x41, 0x43, 0x48, 0x50, 0x49, 0x00, 0xFF,
    0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
    
    • この署名は暗号学的なものではありません。
    • ファイルのフォーマット識別子(マジックナンバー)の様なものです。
  3. 正しい署名が受信できなかった場合、自動的に切断されます。
    • 何もデータを受信できなかった場合、現在の実装では自動的に終了できず、延々とデータが送られるまで待機します。
    • 切断されると、クライアントは終了します。
    • サーバーは他のクライアントからの接続を待機します。
  4. 次に、サーバーとクライアントで表示名を交換します。
    • 交換するのはサーバーと一つのクライアントの表示名となります。
    • 何らかのメッセージが送られるまで、クライアントは、他のクライアントの表示名を感知しません。
    • この表示名はサーバー側で、参加しているクライアントを把握する為に用いられます。
    • また、現在の実装では表示名の重複などは検査されません。
  5. 表示名の交換が終わると、メッセージを送受信する為の無限ループに入ります。

メッセージの送受信

  1. クライアント側のコンソール画面に文字列を入力すると、サーバーへその文字列が送られます。
  2. サーバーは、受信した文字列に日時情報と送信者情報を付加してメッセージを作成します。
  3. サーバーは、参加している全てのクライアントへメッセージを送信します。
    • この時、メッセージの送信元のクライアントにも送信されます。
    • この様にする事でメッセージが正しく送信されたか確認する事ができます。

今後の展望

  • 小さなパケットが分割されない様にする。
  • 安全な終了処理を実装する。
  • 表示名の重複などを検査する。
  • サーバーと各クライアントに一意識別子(GUID など)を割り振る。
  • 送信者情報に IP アドレスとポート番号を含める。
  • メッセージの送信元に同じメッセージを送信しない様にする。
    • 送信するかどうかを設定で切り替えられる様にする。
  • 通信の暗号化を行う。
  • 表示名を変更できる様にする。
  • 自分自身の送信者情報を確認できる様にする。
  • 個人情報の保護設定を変更できる様にする。
  • メッセージの送信先を限定できる様にする。
  • 一つのクライアントから複数のサーバーへ接続できる様にする。
  • 送信先のサーバーを切り替えられる様にする。
  • ファイルの共有を行える様にする。
  • コマンドを実行できる様にする。
    • 互換性を考慮して、コマンドはサーバーで実行する。
    • 現在、SIFOSC 機能として開発している。
    • セキュリティ上の懸念がある事に留意する。

About

「高速会話プロトコル・インターフェース」(FACHPI: Fast Chat Protocol/Interface)の参考実装。開発者のプログラミング学習目的で開発されたものであり、実用性は全く無い。

Resources

License

Stars

Watchers

Forks