smk7758のブログ

日常のことからMinecraft, プログラミング, PCのことまでを不定期日記として公開しています。

2017年10月

てか備忘録って、「記憶すべき事柄を簡単にメモするための個人的な雑記帳である」(備忘録 - Wikipedia)らしいですね。

それはさておき、一応King(qpwakaba)主催のSprinqlerに参加しているのでネットワーク通信のサーバー関係を学んでおこうかと思って調べました。かなり簡潔に書いてるだけなので、詳細はWikiを。
参考サイト: http://wiki.vg/Protocol

|~|的なやつは、表にしたかったけど、やり方分からず適当にやったなれ果てです。

1. MinecraftサーバーのPacketの基本構造

| Packetの大きさ(VarInt) | Intで取得してから、送信する時はVarIntというものに変換しなければならないみたい。
|                                    | (一応言うと、Packet全体の大きさを示さないといけないので、Packetのデータがわからないといけません)
| PacketID(byte) | 0x00や0x01とか。(WikiにはVarIntと書かれてるけどbyteで行けるのでは?と思ってる)
| Packetのデータ | それぞれのPacketの適する構造でなければならない。

2. Status確認の流れ
C: Client(クライアント), S: Server(サーバー)
クライアント目線で書きます。
1. Socket開設(C→S)
2. Handshake Packetの送信(C→S)
3. ServerStatus Packetの送信(C→S)
4. ServerStatusResponse Packetの受信(S→C)
5. Ping Packetの送信(C→S)
6. Ping Packetの受信(S→C)
Status確認なのでこれだけです。

3. Handshake Packetの構造
Minecraftサーバーに接続する時には、HandshakeというPacketを送信しなければなりません。
次に示す構造になっています。(Packetのデータの部分の内容となります)

PacketID: 0x00
Protocolのバージョン(VarInt) | Minecraftのバージョンごとの番号を送信してください。なお、1.7.2とそれ以前の互換性はありません。
| サーバー接続のアドレス(String) | サーバー接続で用いたアドレスを送信してください。
| サーバー接続のポート(short) | サ
ーバー接続で用いたポート番号を送信してください。
| State(Varint) | サーバーへこれからどのような操作をするのかを伝えるために送信します。なお、1か2のどちらかでなければなりません。
|                    | 1は、Status確認用。2はLogin用です。よって、今回は1を送信してください。

3. ServerStatus Packetの構造

PacketID: 0x00
Data構造はありません。ですので、Packetの大きさ(1byte)とPacketID(0x00)を送信するのみです。

4. ServerStatusResponse Packetの構造

PacketID: 0x00
| サーバー情報(ServerStatus)が書かれたJSON(String) | JSONがStringとして送信されます。

5. Ping Packetの構造

PacketID: 0x01
| それぞれのミリ秒時間(long) | クライアント、サーバーそれぞれの時間を送受信し合います。

なお、Packetの大きさは基本9byteだと思います。また、それぞれの時間の差分がPingの時間となります。

final DirectoryChooser fc = new DirectoryChooser();
fc.setTitle("フォルダ選択");
if (Main.primary_stage != null) {
File import_file = fc.showDialog(Main.primary_stage);
if (import_file != null) field_download_path.setText(import_file.getPath().toString());
} else {
System.out.println("Main.primary_stage is null.");
}

・Main.primary_stageは大本のウインドウ。これを設定するとウインドウが消されない限り、そのウインドウはブロックされる。
・field_download_pathはJavaFXのfieldですのでほぼStringです。
なんかこんな感じで出来るみたいです(雑)。

参考ページ: http://javafx-trick.appspot.com/article/110010/80075/70113.html

タイトル長え((

というわけで前半からですが、JavaFXのProgressBarの使い方は基本的にJavaFX: JavaFX UIコンポーネントの操作(Oracle)をみればわかる。
んで、new ProgressBar(0.6);って入力したら、これはProgressBarが不変になっちゃうんですね。
後からsetProgressしても表示が変わらなくて困っちゃった。
というわけで、newは不変にするときだけしか使っちゃ駄目です(文章を読めや自分)。

というわけで後半です。
Controllerのインスタンスの取得ですが、Singleton的な感じでやるのではなくて、普通にコンストラクタの引数に指定して、
thisで他クラスに与えるようにしてしまいました。楽だもんね。

一応他の方法として、"http://d.hatena.ne.jp/torutk/20120517/p1"の方法が使えるんだけど、自分の環境だと上手く動かなかったので、次のように修正してみると動いた。Controllerを自分のControllerクラス名に変更すれば良し。
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml.fxml"));
Scene scene = new Scene(loader.load());
Controller ctr = (Controller) loader.getController();

おわり。

いつからかはわかりませんが、このブログサイトにアクセス出来なくなっていたので以下のような対応を取らせて頂きました。
ご迷惑をおかけしましたことをお詫び申し上げます。

以前は無料のtkドメインに登録してやってましたが、今回からまたまた無料のf5.siというDDNSサービスを提供しているサービスに変更しました。
変更後のURL: http://smk7758.f5.si

tkドメインの有効期限が切れたため、広告サイトに転送されるようになったための措置です。(初めからf5.siにしとけば良かった)

部活で、OpenCVを用いて色々プログラミングをしています。楽しい。

そんななかで、ちょっといくらか気になったことがあったり。

・映像ファイルIOのライブラリあんまりなくね!?
→JMFとかが検索すると出てきたけど、こいつ古すぎるライブラリなので使っていいのかよくわからない。というわけで、色々調べたけどあんまり出てこなかった。(下記のやつを調べた中で見つけたけれども, Twitterには書いたけど)

・映像ファイルって中身どうなってるの!?
→バイナリデータとかそもそもの部分の理解が自分には無かったので、一から学んだ。
ただ、Aviファイルを自作しようかと考えてるが、なかなか手ごわい。ヘッダーとかはいいけど、無圧縮のデータってどうやるんだろう。
そういうことさえ知らないから難しい…。けど結構面白いかもと思ってる。

・FileSystems.getSeparator()とFile.separatorってどっち使えばいいの!?
→新しいパッケージであるjava.nio.file.FileSystemsで良い。JavaDoc(Java8)をみると、「このAPIは、java.io.Fileクラスの多くの制限を克服するために使用できます。」云々と書かれていますので。
というかFileSystemsってのがあるのか。今後、ファイル・ディレクトリ操作には、
java.nio.fileのパッケージを使ってゆこう。

こんな感じで。この開発はいい経験になりそう。

↑このページのトップヘ