てか備忘録って、「記憶すべき事柄を簡単にメモするための個人的な雑記帳である」(備忘録 - 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の構造
それはさておき、一応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の時間となります。
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の時間となります。