【问题标题】:Why Packet sending send no data (handshake with minecraft server)?为什么数据包发送不发送数据(与我的世界服务器握手)?
【发布时间】:2012-09-24 09:55:58
【问题描述】:

我正在尝试使用数据包在 c# 中制作一个 Minecraft 假客户端,即 Minecraft 聊天机器人。 我已经尝试了很多不同的方法来实现这一点,但没有运气。

每次我发送数据包时,它都不会发送数据(使用数据包嗅探器)。 虽然数据包嗅探器说数据包的总大小是: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 还很陌生

【问题讨论】:

  • 这里发生了很多奇怪的事情。你为什么打电话给Main(args)而不是使用while循环?你不需要第一次解析ip,因为你会直接在try中覆盖它。为了提高可读性,请使用比gb 更具描述性的方法名称。 C# 可以处理更长的方法名(变量名也是如此)!
  • 失败后如何回到起点?因为有一个while循环它会继续。 (也许是转到?)
  • 你的意思是它会继续吗?在条件为假之前它不会继续。当client.Connect 成功时,你可以做while (!done) 并设置done = true;
  • @default 哈哈确实是我的错。但回到主题?

标签: c# sockets packet minecraft


【解决方案1】:

我稍微清理了你的代码:

    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();
            }
        }
    }

至于您最初的问题,我们需要更多信息。你说数据包嗅探器没有显示数据,但你说数据有大小。那么您是否看到数据?你确定服务器已经启动了吗?我发布的代码对我有用,这意味着它连接到我本地系统上的服务器并发送字节。

【讨论】:

  • 好吧,数据包嗅探器没有显示数据,但它说它有一个大小(奇怪)。服务器也启动了。
  • 它没有给出更多错误,我只需要进一步开发(更多数据包等),所以以后可能会在这篇文章 idk 上回来。
  • 没有理由在catch 子句中设置keepTrying 标志 - 在所有内容运行之前无法将其设置为 false。您也不必设置ip = null,IpAddress ip; 就足够了(port = 0; 也是如此)。不过,TryParse 不错。
【解决方案2】:

这有点老了,但我还是看看能不能帮到你。

Minecraft 协议相当复杂,如果不实现其中的绝大部分,您将无法连接到 Minecraft 服务器。协议细节可以在here找到。

我建议你考虑走一条不同的路线。由于 Minecraft 的复杂性,我会避免自己实现它。幸运的是,我是 Minecraft 爱好者,我已经为你完成了大部分工作。我建议你看看Craft.Net 库。它包含一个完整的协议实现,并且从中制作一个聊天机器人将是微不足道的。事实上,here's 是一个使用 Craft.Net 的聊天程序示例供您细读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多