よし、緊急事態宣言の解除には間に合ったな!
出来上がりましたよ。ちなみに動作は LinuxMint20.1 上でしか試していません。
後述しますが、既知の…というか意図的に放置しているバグがあります。(意図しないバグが無いとは言っていない)
という訳で、サーバー側になる server.py とクライアント側になる main.py です。
クライアントを main.py としたのは KivyLauncher で動作させる予定だったからなのですが…
そもそも PlayStore 上の物は16年位から更新が途絶えている為、 Android 6 以降では FileChooser 系が動かないのでなんともという感じです。
このため、今後 Android 上で動作確認をするかは不明。
で、このセットはシンプルにサーバーはログインしてきたクライアントの情報を収集して、集計情報を還すだけ。
クライアントは位置クリック時にサーバー側に情報を渡し、一定時間でサーバーが吐いた集計情報を受け取って情報を更新、描画を行うだけ。
という、それだけの動作しかしません。
代わりにソースは大変短く、サーバーが200行、クライアントが500行程度となっています。
又、一般的なネットゲームではクライアント、ゲームサーバーの他にユーザー登録等を行うログインサーバーがありますが、本質から離れる為作っていません。
本プログラムは同名のクライアントが複数ログインすると動作が不安定になり、本来はログインサーバーが弾くべきなのですが上記の理由から放置しています。
同時に複数サーバーを起動した場合の暴走除け処理も書いていないのですが…製品ならともかく流石にどうかと思って書いていません。
- 使い方
クライアントとサーバーのどちらから先に起動しても構いませんが、上に表示されている共有ディレクトリを同じものを示すように選択してください。
※本プログラムは本格的なサーバーの代わりに共有ディレクトリを使用します。尚、テストケースでは USB メモリを使っていました。破損する事はあまり無いと思いますが、リムーバブルメディアの使用を推奨します
次にサーバーの Start ボタンを押します。
※尚、サーバーのスクリプト実行時点で停止中を示す stop というファイルが共有ディレクトリに作られるので、クライアントを実行しても停止中の表示になります。
起動後に毎回共有ディレクトリを選択するのが面倒な場合、サーバー、クライアント各ソースの MyData クラスの初期化時に書かれている
directory=""
部分をに適宜作業ディレクトリのパスを書く事でディレクトリの初期値を決める事ができます。
サーバー起動後、クライアント側でログインするのですが必ず別の名称をつけてログインしてください。
サーバー側にはクライアントが出力しているログファイルのリストが、クライアント側には自分と他のクライアントの表示が出るハズです。
又、現在既知のバグとしてウィンドウが非アクティブの状態でクリック(タップ)した場合、動作が不安定になったり、タップした座標が乱れる現象がでています。
非アクティブの場合は一度ウィンドウタイトル(ウィンドウ上部)をクリックしてから入力してみてください。
- 確認できる内容
真っ当な操作としては、クライアント起動時にサーバーを停止( Stop を押す)のサービス正常停止。
クライアントを正常ログアウト( Logout を押す)させての他のクライアントからの消滅。
異常な操作としては、サーバー異常停止(サーバーのウィンドウをxボタン等で閉じる)しての、クライアント側からの自分だけ動けて他のクライアントが停止している、典型的なサーバーダウン状態。
及び、その状態からサーバー再起動でのサーバー復旧。
クライアント異常停止(クライアントのウィンドウをxボタン等で閉じる)しての、他のクライアント側からの強制終了したクライアントが停止して見える、『ゲーム落として逃げやがった』状態。
以上が思いつく限り確認できました。
- 何をやっているのか?
端的に書けばファイルを介したプロセス間通信なんですが…作業フォルダ上に上記のようなファイルが出来まして。
クライアント出力ファイル(生成:クライアント)
クライアントが画面をクリックする度に更新されるファイル。
現状ではファイル名:_[ClientName].csv
内容
名前/色/最後に座標を確認できた時間/最後に確認できた座標/次の座標への到着予定時間/次の座標
となります。
サーバー出力ファイル(生成:サーバー)
サーバーが一定時間で更新するファイル。
単純に全クライアントの出力ファイルを結合した物。
サーバー状態ファイル(生成:サーバー)
サーバーの状態を示すファイル
この中で重要なのはサーバー状態ファイルで、サーバー起動時はファイル名が stop となり、クライアント側はこのファイルを発見すると停止します。
次にサーバー稼働( Start を押す )すると全クライアント出力ファイルを結合し new_journal.csv というファイルを作成します。
この処理の間はクライアントは旧 journal.csv を読んでいる可能性があります。
次にサーバーは旧 journal.csv を削除して new_journal.csv をリネームし、journal.csv として更新を行います。
※普通のサーバーならば、旧 journal.csv のファイル名に時間を付加してリネーム→保存を行う所ですが、膨大なファイルができる(現状1秒で13個ファイルが作られる)為、行っていません。
このリネーム処理中はクライアントにアクセスされないようにサーバー状態ファイルを「 work 」という名前に変名し、クライアント側に更新中である事を報せます。
リネーム処理が終了するとサーバー状態ファイルを「 release 」という名前に変名し、クライアント側に読み込み可である事を報せます。
…正直割と雑な処理をしています。
又、現状の処理タイミングですが、サーバーは1/13秒、クライアントは描画が1/12、サーバー出力ファイルへのアクセスが1秒に1回となっています。
どの程度の負荷に耐えられるかは機材によるのでなんとも言えません。
…と、まあ、なんとか今年の目標を早くも達成…他にも目標はあるのですが。
あと、最近モデリングをやっていないのは故意に Blender2.7 系の操作を忘れて 2.8 以降に移行する意図がありまして、その間にやる事…として思い立ったという側面もあります。
もう少し手を加えてゲームっぽくする事も可能なのですが、ひとまず一旦ここらで〆(まあ、重いバグが出れば修正しますが)としたいと思います。
0 件のコメント:
コメントを投稿