2

パケットを使用して、C# で Minecraft の偽のクライアント (別名 Minecraft のチャットボット) を作成しようとしています。私はすでにこれを達成するためにさまざまな方法を試しましたが、うまくいきませんでした。

パケットを送信するたびに、データは送信されません (packetsniffer を使用)。パケットスニファーは、パケットの合計サイズは 190 バイトであると言っています。サイズは 17 バイトです。

これが私のコードです:

 static TcpClient client = new TcpClient();
    static void Main(string[] args)
    {
        Console.WriteLine("Start GATHERING INFO.....");

        Console.Write("Write a ip: ");
        IPAddress ip = IPAddress.Parse("192.168.178.11");
        try
        {
            ip = IPAddress.Parse(Console.ReadLine());
        }
        catch
        {
            Console.Write("\nUnknown/Wrong ip entered redirecting to :  127.0.0.1 (AKA Localhost)");
            ip = IPAddress.Parse("192.168.178.11");
        }
        Console.Write("\nWrite a port: ");
        int port = int.Parse(Console.ReadLine());

        Console.WriteLine("Connecting.....");

        try
        {
            client.Connect(ip, port);
            client.NoDelay = false;
            Console.WriteLine("Connection succesfull!");
        }catch
        {
            Console.WriteLine("--== ERROR WHILE TRYING TO CONNECT PLEASE RESTART PROGRAM ==--");
            Console.ReadKey();
            client.Close();
            Main(args);
        }

        Stream stream = client.GetStream();

        Console.Write("Please enter a username: ");
        string usrn = Console.ReadLine();
        Console.Write("\n");

        byte[] data = new byte[3 + usrn.Length*2];
        data[0] = (byte)2;
        data[1] = (byte)29;
        gb(usrn).CopyTo(data, 2);

        stream.Write(data, 0, data.Length);

        Console.ReadKey();

    }

    public static byte[] gb(String str)
    {
        return System.Text.ASCIIEncoding.ASCII.GetBytes(str);
    }

パケットは次のようになります。

http://www.wiki.vg/Protocol#Handshake_.280x02.29

他のボットが使用していないため、サーバー ホストとサーバー ポートは無視します。(ただし、機能しませんでした:/

元のクライアント パケットの内容は次のとおりです。

「奇妙な goto を示しています: https://dl.dropbox.com/u/32828727/packetsocketsminecraft.txt

timboiscool9 (私のユーザー名) 192.168.178.1 (サーバー IP)

この後もまだありますが、これが私が必要としているものです。

私はソケットとtcpclientsにかなり慣れていません

4

2 に答える 2

2

私はあなたのコードを少しきれいにしました:

    static void Main(string[] args)
    {
        bool keepTrying = true;
        while (keepTrying)
        {
            Console.Write("Enter server IP Address: ");
            IPAddress ip;
            if(!IPAddress.TryParse(Console.ReadLine(), out ip))
            {
                Console.WriteLine("Invalid ip entered, defaulting to 192.168.178.11");
                ip = IPAddress.Parse("192.168.178.11");
            }

            Console.Write("Enter server port: ");
            Int16 port;
            if(!Int16.TryParse(Console.ReadLine(), out port))
            {
                Console.WriteLine("Invalid port entered, defaulting to 1234");
                port = 1234;
            }

            Console.WriteLine("Connecting.....");

            try
            {
                TcpClient client = new TcpClient();
                client.Connect(new IPEndPoint(ip, port));
                client.NoDelay = false;
                Console.WriteLine("Connection succesfull!");

                List<byte> data = new List<byte>() { 2, 29 };
                Console.Write("Please enter a username: ");
                byte[] userName = ASCIIEncoding.ASCII.GetBytes(Console.ReadLine());
                data.AddRange(userName);

                using (var stream = client.GetStream())
                {
                    stream.Write(data.ToArray(), 0, data.Count);
                    Console.Write("Data sent!");
                }
                keepTrying = false;
            }
            catch
            {
                Console.WriteLine("--== ERROR CONNECTING ==--");
                Console.WriteLine();
            }
        }
    }

元の質問については、さらに情報が必要です。あなたは、パケット スニファーがデータを表示しないと言いますが、データにはサイズがあると言います。それで、あなたはデータを見ていますか?サーバーは稼働していますか?私が投稿したコードは機能します。つまり、ローカル システムのサーバーに接続してバイトを送信します。

于 2012-10-03T15:24:58.987 に答える
0

これは少し古いですが、私があなたを助けることができるかどうかを見ていきます.

Minecraft のプロトコルは非常に複雑であり、その大部分を実装しないと Minecraft サーバーに接続できません。プロトコルの詳細については、こちらを参照してください。

別のルートを検討することをお勧めします。Minecraft は非常に複雑であるため、自分で実装することは避けたいと思います。幸いなことに、私は Minecraft の愛好家であり、ほとんどの作業を行ってきました。Craft.Netライブラリをご覧になることをお勧めします。完全なプロトコル実装が含まれており、それからチャット ボットを作成するのは簡単です。実際、Craft.Net を使用したチャット プログラムの例を以下に示します

于 2013-01-28T22:00:25.763 に答える