当前位置: 首页 > 知识库问答 >
问题:

与minecraft bukkit服务器握手-发送服务器主机字段失败

宋育
2023-03-14

我试图为minecraft服务器制作客户机/机器人,以自动保护聊天和禁止垃圾邮件发送者。(第一个成就)
我在这里找到了一些文档,并从这里实现了数据类型(所以它们看起来像这样--我还没有完成)。现在,我正在尝试发送inital0x02数据包,应该如下所示:

size    value                comment

1       0x02                 Packet ID
2+?     string               Username (I send "jakub")
2+?     another string       Server host name - here, the program FAILS*
4       25565                Port number

*fails表示bukkit服务器在控制台中输出以下内容,套接字关闭:

11:09:45[信息]/127.0.0.1:51256失去连接

我现在可以看到如何测试我的数据类型是否正确,但因为我似乎发送用户名没有问题,我认为我发送了错误的信息,尽管格式是正确的。

但不管怎样,我很好奇我是否做得对。我有mc_shortmc_string的类。以下是mc_short如何创建2个字节:

//mc_short::val is type of short 
void mc_short::asBytes(char* data) {  
    for (int i = 0; i < 2; i++)
       data[endianity?i:1-i] = (val >> (i * 8));  //Some magic with byteshifting.
       //endianity is set to false, because java uses BigEndian everywhere** (UNFRIENDLY PERSONS!!)
}

**参见http://wiki.vg/data_types:

Java中的所有类型(以及Minecraft)都是big-endian,也就是说,最重要的字节排在第一位。

然后字符串本身使用mc_shortstd::string填充char*中的字节。

void mc_string::asBytes(char* data) {
    mc_short size((short)val.length());  //val is std::string
    size.endianity = endianity;          //mc_string::endianity is boolean, and is ony used to determine endianity of the first 2 bytes
    size.asBytes(data);  //Filling 2 bytes in data - length info
    for(short i=0; i<size.value(); i++) {
        data[i+2] = val[i];  //Copying std::string to data
    }
}
  1. 我应该发送什么作为“服务器主机名”,0x02的第三个字段?
  2. 发送字符串正确吗?是否需要其他转换?

我知道,我的问题是关于不太为人所知的话题,因此你可能不知道答案,也不知道话题本身。在这种情况下忽略这个问题就行了。

共有1个答案

鞠嘉志
2023-03-14
    null

因此,如果您做了第一个,您将需要用Java编写一个插件。我对此了解不多。

如果你还想完全滚自己的,祝你好运。

 类似资料:
  • 我一直在开发一个java程序,基本上类似于Minechat(基于文本的应用程序,用于查看聊天。)我从来没有在网络方面做过太多工作,所以问题是如何正确发送数据包。我目前正在创建与服务器的握手。经过几个小时的研究,我终于想出了以下代码,但它总是会出现“失败!(异常)”的消息。对我来说,一切看起来都是正确的,但据我所知,它可能是100%错误的。如果有人能指出我做错了什么,我会非常感激。 作为参考,请随意

  • 问题内容: 我一直在研究一个Java程序,该程序基本上类似于Minechat(基于文本的应用程序,仅用于查看聊天。)我从来没有真正与网络打交道,因此,问题在于弄清楚如何正确发送数据包。我目前处于与服务器创建握手的位置。经过数小时的研究,我提出了以下代码,但始终会遇到“ Failed!(Exception)”消息。对我来说,一切看起来都是正确的,但就我所知,这可能是100%错误的。如果有人可以指出我

  • 我使用vert. x java客户端连接安慰服务器。当使用SSL证书进行连接时,收到以下SSL握手错误。我在代码中使用setTrust all(true)。有人能帮助解释错误的原因和解决方案吗? 以下是错误:SEVERE:未处理的异常java.lang.IllegalStateExctive:桥没有成功启动io.vertx.amqpbridge.impl.AmqpBridgeImpl.create

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 如果我正确理解了服务器发送事件的原则,那么每次客户端注册到EventSource时,它实际上会打开一个到管理事件的资源的新HTTP连接。与其他HTTP请求相反,连接保持活动状态,因此专用于此客户端的服务器进程/线程将一直运行,直到客户端断开连接。 如果我们有1000个客户端使用SSE连接到一个应用程序,该怎么办?我们是否会有1000个进程/线程(做同样的事情)并发运行以处理SSE?我想我错了,但如