Python で記述された Minecraft クラシック サーバーを設計していますが、パケットを適切に送信する方法がわかりません。ソケットのセットアップ方法は知っていますが、プロトコルで必要な形式でソケットを送信する方法がわかりません。私はプロトコルを理解していますが、Python で実装する方法は理解していません。投稿するコードは実際にはありません。ハートビートだけです。それは私の質問には関係ありません。いくつかのサーバーのソースを調べましたが、理解できません。
1 に答える
Dan D. が述べたように、struct.pack を使用して、プロトコルの要求に従ってデータをフォーマットできます。http://docs.python.org/library/struct.htmlのドキュメントには、いくつかの例があります。
次に、 http://www.minecraftwiki.net/wiki/Classic_Server_Protocol#Packet_Protocolでパケット構造を確認する必要があります。これには、パケットがどのように見える必要があるかが詳細に説明されています。パケットの説明によると、最初の 4 バイトには "Bbh" のような struct.pack フォーマット文字列が必要です。
struct.pack("Bbh", 0, 1, 7)
ID 1 およびプロトコル バージョン 7 のプレーヤー識別パケットの場合。これは、パケットの残りの 64 バイト文字列 + 1024 バイトのバイナリ部分で、両方ともパディングで完了する必要があります。
編集: Pythonはネイティブのビッグエンディアンではない可能性があることを思い出したので、それをフォーマット文字列にもスローしたい場合があります。
struct.pack("!Bbh", 0, 1, 7)
myne2 サーバーのソースを調べると、パケット形式の例とそれらの処理方法を見つけることができます。
https://bitbucket.org/andrewgodwin/myne2/src/236deac8cd2f/myne/core/constants.py
https://bitbucket.org/andrewgodwin/myne2/src/236deac8cd2f/myne/core/packeter.py
structのpython モジュールの週ページにも、非常に役立つ情報がいくつかあります。