Netty 有人能更好地解释解码器/编码器吗?

Netty 有人能更好地解释解码器/编码器吗?,netty,Netty,修订问题: 好的,所以我正试图把它融入到我自己定制的游戏中。我了解Netty服务器和客户端的连接过程。我也了解解码器和编码器在理论上是如何工作的。但这是我仍然想理解的 我的服务器进程: Server boots up -> Client starts Client requests connection -> Server accepts Server instructs client connection is good -> Client continues to the

修订问题:

好的,所以我正试图把它融入到我自己定制的游戏中。我了解Netty服务器和客户端的连接过程。我也了解解码器和编码器在理论上是如何工作的。但这是我仍然想理解的

我的服务器进程:

Server boots up -> Client starts
Client requests connection -> Server accepts
Server instructs client connection is good -> Client continues to the login screen
(Ignoring any type of security protocol)
Client sends username and password over Channel
Server gets username and password checks it in the database or file
Server pushes -> yes or no
if yes Server sends player stats
if no Server creates new player
在这个过程之后,我知道我需要一个world处理程序,这样每个人都可以近实时地看到更新。现在我不知道如何实现这些东西的解码器

我真的很想看到一些例子,并解释它们是如何实现的。 最好有一些说明。。。。
注意:我不是说帮我解决这个问题,而是告诉我如何处理不同的信息。最佳实践和标准请….

人们编写自己的编码器/解码器(编解码器),因为Netty不强制或定义应用程序级协议,所以您可以自由编写自己的协议。您定义的编解码器集是一个协议,它可以是基于字符串的协议,也可以是Protobuf等二进制格式。Netty为您提供了方便的编解码器(您使用的就是示例)

我想这是为了防止水流提前断流

通常,在发送/接收流时,需要将其分解为固定长度的块(称为帧)。一种流行的方法是使用块的长度(通常是4字节的整数)作为从流中读取的第一个字段,这种方法自互联网诞生以来就一直被使用。因此,如果第一个int的值是20,那么您知道接下来的20个字节是有效负载(数据),第21个字节是另一个长度的第一个字节。这种方法的优点是它允许可变长度的块。但你不限于此。例如,如果您计划编写一个使用预定义长度字符串(带填充)的协议,那么您将编写或更好地使用适合它的Netty current编解码器

有一次,我用三个解码器实现了一个协议,按照以下顺序执行:

  • 接收流并将其分解为长度前缀帧
  • 将每个帧转换为字符串
  • 使用Jackson Library将字符串转换为预定义的Java对象
  • 编码器将只执行相同的操作,但向后。不幸的是,我丢失了原始代码,但我将很快重写它

    但是流如何知道流是一个字符串、一系列int或一系列double?你怎么知道区别是什么

    简短回答:它不知道。您必须在编解码器中对这些信息进行编码。例如,您可以使用操作码作为有效负载中的第一个字段,该字段表示有效负载是字符串、双精度、整数或两者的任意组合


    基本上,Netty提供了一个流,您可以随意解码。例如,如果您正在读取一系列long(8字节),那么您将编写一个编解码器,每次从流中读取64字节,因为每个字节代表一个long。Netty提供现成的编解码器,因此您无需每次都重新发明轮子。

    我想补充一点,我正在参考Netty API,以及它如何真正使用解码器和编码器。。。我觉得这本指南并没有详细介绍如何实现自己的解码器以及如何。。。正如我上次所说,我还要重申。我已经在这个问题上苦思冥想了一段时间,但我似乎无法理解……我提交给你们考虑。我不是想把你赶走,但我试图解释其中的秘密。这是一个系列中的第二个,你可能也会想。谢谢,这是有意义的,并且让它变得清晰一点。。。至少有点让我知道我对它的工作原理有正确的印象。。。