【问题标题】:How does minecraft actually connect to a server?我的世界实际上是如何连接到服务器的?
【发布时间】:2020-11-22 19:15:09
【问题描述】:

出于我的迷你项目的目的,我需要在我的客户端和某个服务器之间建立一个代理服务器。此代码有效,但它不起作用。它开始连接,通过登录并停止加密,然后过了一会儿它超时,我不知道为什么。我一直在重读 minecraft 协议 (https://wiki.vg/Protocol#Handshake) 和握手,但我仍然无法弄清楚为什么它不起作用。 console.log() 用于调试,我从中推断出无论出于何种原因,服务器都不会发送设置的压缩/登录成功数据包。

var net = require('net');
var mcip = "mc.hypixel.net";
var mcport = 25565;

var server = net.createServer((socket) =>{
        var remoteAddress = socket.remoteAddress + ':' + socket.remotePort;
        console.log('new client connection from %s' + remoteAddress);

        socket.on('data', (d)=>{
            var client = net.connect(mcport,mcip, ()=>{
                console.log("connected to server");
                client.on("data", (data)=>{
                    socket.write(data);
                    console.log(data);
                    console.log("S -> C");
                    client.end();
                });
                client.write(d);
                console.log(d);
                console.log("C -> S");
            });
        });

    });
    server.listen(25565);

【问题讨论】:

    标签: node.js minecraft


    【解决方案1】:

    这里的一个大问题是,每次您的客户端发送数据时,您都会重新连接到 Hypixel!当您的客户端连接到您时,您需要重新安排它以仅连接到服务器一次。

        socket.on('data', (d)=>{
            var client = net.connect(mcport,mcip, ()=>{
                console.log("connected to server");
                client.on("data", (data)=>{
                    socket.write(data);
                    console.log(data);
                    console.log("S -> C");
                    client.end();
                });
                client.write(d);
                console.log(d);
                console.log("C -> S");
            });
        });
    

    变成这样:

        var client = net.connect(mcport,mcip, ()=>{
            console.log("connected to server");
            client.on("data", (data)=>{
                socket.write(data);
                console.log(data);
                console.log("S -> C");
            });
        });
    
        socket.on('data', (d)=>{
            client.write(d);
            console.log(d);
            console.log("C -> S");
        });
    

    请注意,现在我们并没有结束与 Hypixel 的连接,而是保持打开状态并继续发送客户端数据。 (当您的客户端断开连接时,您应该在 socket.on('close', (hadError)=>{...}) 处理程序中处理关闭连接)

    通过此更改,代理开始工作,但 Hypixel 会立即将您踢出,因为您没有通过正确的地址连接。在握手包中,连接的我的世界客户端会将服务器地址设置为代理服务器的地址,因为就它而言,这就是它所连接的地址。 Hypixel 发现这不是“mc.hypixel.net”并踢掉了客户端。

    即使不是这种情况,一旦连接达到播放状态,您将无法看到任何有意义的数据(我怀疑您希望看到),因为它全部由 aes CFB-8 加密流密码,使用 RSA 从 MC 客户端传递到服务器的密钥(您无法获得它)。

    不要让这让你灰心,有可能连接到 minecraft cs。它只是涉及更多:p 如果您想进一步讨论该主题,请随时在 discord (Azurethi#0789) 上添加我。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2014-01-16
      • 2011-03-04
      相关资源
      最近更新 更多