轻光233
我的测试代码如下图(服务器版本1.12)

b.size()+1那里是正确的,"light_light_233".length()本身应该占两个长度,不知道是怎么了只占了一个长度,所以加一修正了
当执行到int length = readVarInt(dis);那一行时,出现了服务器在等我的数据包,我也在等服务器的数据包的尴尬情况
最后就会以服务器抛出 /127.0.0.1:49710 lost connection: Timed out 结束链接
但我在查阅了wiki.vg/Protocol之后,发现在第二个数据包发送完之后应该会给我发送一个加密请求的数据包

但服务器并没有发送给我
某群的某位dalao说让我关掉online-mode,关了还是一样的
所以发到论坛里看看有没有dalao知道这是怎么一回事qwq
求大佬解答

Dante_7
这个问题比较简单, 首先你说的没有收到加密包, 是因为盗版会直接跳过加密的部分(是的, 盗版服的通讯完全是不加密的)直接进行压缩包阈值的设置, 结束后整个握手过程结束, 协议进入 Play 状态.

如果你是弄一个能够模拟玩家登录服务端的程序, 我建议你使用国外大神的 McPrototolLib 项目(github 连接: https://github.com/Steveice10/MCProtocolLib), 据我所知以前有一个并发压测就是以它作为通讯模块来写的.

这个项目(还有同一作者的 PacketLib)设计优良, 上手简单. 楼主在使用的过程中不妨学习一下作者在编程中的技巧, 对自己也一定有所提高.

不会可以追问, 要是觉得我回答得不错, 请给我最高人气评分~

轻光233
凋灵兔子 发表于 2019-8-17 17:03
这个问题比较简单, 首先你说的没有收到加密包, 是因为盗版会直接跳过加密的部分(是的, 盗版服的通讯完全是 ...

谢谢dalao的回复
我主要是通过这个来了解一下mc服务器的连接机制的
MCProtocolLib我之前看到过,不会用2333
那么请问dalao压缩包阈值是哪个数据包来着=-=
如果我想不设置加密该怎么做

Dante_7
轻光233 发表于 2019-8-17 17:09
谢谢dalao的回复
我主要是通过这个来了解一下mc服务器的连接机制的
MCProtocolLib我之前看到过,不会用23 ...

不想设置加密? 这个我还真没研究过, 不过盗版是一定不加密的, 正版是一定加密的...至于正版怎么关闭加密这个我还真的....嗯...不知道

设置压缩包这个我也给忘了, 好久没搞协议了, 就是在 Handshake 子协议中的第五个包, 不加密的话是第三个.

Mcprotocollib真的很简单的, 作者在同项目中写了很多的例子, 基本上改改就能用.

最后建议楼主不要自己造 Socket, 可以借助第三方的 netty 来进行网络通信, 这样就不用自己一个字节一个字节的拆开看了

轻光233
凋灵兔子 发表于 2019-8-17 17:13
不想设置加密? 这个我还真没研究过, 不过盗版是一定不加密的, 正版是一定加密的...至于正版怎么关闭加密 ...

抱歉,我打字打错了
本来想说"如果我不想设置压缩该怎么做"
McProtocolLib的jar包我还在找,等会去试一下2333
dalao知道怎么不设置加密吗qwq?

Dante_7
轻光233 发表于 2019-8-17 17:35
抱歉,我打字打错了
本来想说"如果我不想设置压缩该怎么做"
McProtocolLib的jar包我还在找,等会去试一下 ...

设置加密是服务端的行为, 通过写代码是无法修改的. 你可以去联机板块中的联机教程, jiongjionger 写的那个优化指南上, 有相关的设置, 我记得好像是设置为 -1 就可以关闭压缩功能.

Dante_7
轻光233 发表于 2019-8-17 17:35
抱歉,我打字打错了
本来想说"如果我不想设置压缩该怎么做"
McProtocolLib的jar包我还在找,等会去试一下 ...

哦, 对了, MCproLib 没有jar 包, 有也是老版本的, 你需要自己下载源代码进行编译, 如果你一定要 jar 包的话, 可以加我  QQ 915787013, 我有一个魔改版本可以发给你, 和原来的不大一样, 但是大同小异

轻光233
凋灵兔子 发表于 2019-8-17 17:46
哦, 对了, MCproLib 没有jar 包, 有也是老版本的, 你需要自己下载源代码进行编译, 如果你一定要 jar 包的 ...

加了2333
你说的那个-1我好像在Protocol的哪里看到过,现在在翻呢
谢谢dalao了总之

Dante_7
轻光233 发表于 2019-8-17 17:53
加了2333
你说的那个-1我好像在Protocol的哪里看到过,现在在翻呢
谢谢dalao了总之 ...

哈哈, 我给你找吧

在 server.properties 文件下的 network-compression-threshold 配置, 设置为 -1 就可以了

一定要注意记录和总结, 这样在下一次用到了才能立刻想得到, 要不然学一点忘一点, 那学习效果课就大打折扣了

轻光233
凋灵兔子 发表于 2019-8-17 17:56
哈哈, 我给你找吧

在 server.properties 文件下的 network-compression-threshold 配置, 设置为 -1 就可 ...

好的,谢谢了
但是,此项设置成-1后还是会出现那种都在等数据包的情况
请问这又是咋回事qwq

Dante_7
轻光233 发表于 2019-8-17 18:11
好的,谢谢了
但是,此项设置成-1后还是会出现那种都在等数据包的情况
请问这又是咋回事qwq ...

如果你正确的处理了压缩包, 那下一步就是 Play 子协议了, 需要你回复他的心跳包.

另外你能不能先给个人气的, 我都说了这么多了...= =

轻光233
凋灵兔子 发表于 2019-8-17 18:13
如果你正确的处理了压缩包, 那下一步就是 Play 子协议了, 需要你回复他的心跳包.

另外你能不能先给个人 ...

问题是。。。服务器在我发送完第二个数据包之后并没有给我发送任何的数据包,压缩,心跳啥的都没得
难道是我接收的问题吗?下面接收的代码我都是按照wiki.vg给的example写的,测试Server_List_Ping一点问题都没有=-=

Dante_7
我仔细看了看我以前的代码, 如果你前两个包正确的发送给了服务端, 有关闭了压缩和正版验证, 那下一个包一定是 LOGIN SUCCESS, 一般来说服务端在发送完这个包以后会立即切换到 Play 子协议, 然后发送第一个心跳包, 所以看上去两个包是同时到达, 不可能没有收到任何数据. 如果你发送的数据没问题, 那应该是服务端发给你了, 但是你没有处理到....

网络编程比较复杂, 问题也是五花八门, 你最好开 debug 一步一步来, 看看问题出在哪里