言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Croquet ネットワーク共有のしくみ

Croquet では P2P ネットワークを通して空間を共有出来るようになっている。この共有部分はまだまだ開発途上なのだが、とりあえず現在どうなっているのかを簡単に調べてみた。

クラス

  • TeaHost: 実際に通信を行うオブジェクト
    • mapNameToObj 名前->本物
  • TeaParty: ネットワーク上の架空の場を現す。
  • TeapotMorph: 画面の表示とやってきた信号の処理を行うバーチャルマシンのような物(まずい設計だ!)
  • TeaName: 物理的に他のマシン上にあるものを参照する名前

あらすじ

Croquet ユーザは、同じ TeaParty に参加する事によって三次元空間を共有する事が出来る。お互いの位置はアバターとして表示され、空間の中で動いたり物を動かしたり何か作ったりすると他のユーザからそれを見る事が出来る。

流れ

  • 募集
    • TeapotMorph>>connect:partyName:nickName: で入りたい TeaParty の情報と自分のニックネームを伝える。
    • TeaParty>>helloAll より接続要求メッセージが UDP 255.255.255.255:41434 にブロードキャストされる。
    • この時点で三つの TeaHost が作られる。それぞれプロセスを持ち listen する。
      • TeaHost>>broadcastListener (TeaParty の blistener) UDP 受信用
      • TeaHost>>newLocal (TeaParty の myHost) TCP 送信用受信用
  • 参加
    • TeaParty の blistner はずっと 41434 ポート を監視している。
    • 接続要求メッセージが来るとそれを受け入れ、TeaParty>>hello:nickname: を実行
    • 以下のような 接続先TeaHost が作られる。
      • TeaHost>>tunnelOut: () 41436 で相手に繋がっている(用途不明)
    • TeaParty teaHostSet に登録
  • 共有
    • 共有されるべき操作は TMeta というプロキシオブジェクトを通じて行われる。
    • TMeta は自分の世界に操作を反映させると、他のホストにも同じ操作をブロードキャストする。
  • 終了
    • TeaParty>>resign によってTeaParty から離脱終了する。

通信フォーマット

  • TCP でも UDP でも同じ
  • 受信は TeaHost の持つソケットが行う。送信はいちいち新しくソケットを作る。
  • TeaReferenceStream によってエンコーディングされる(バイナリだが、読めないことも無い)
  • 要素は以下のとおり
    • リテラル #teaMessage
    • TeaTime 現在時刻
    • TeaMessage 送りたいメッセージ