有人可以更好地解释解码器/编码器吗?

Max*_*728 10 netty

修订问题:

好的,所以我想把它融入我自己定制的游戏中.我理解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
Run Code Online (Sandbox Code Playgroud)

在那个过程之后,我知道我需要一个世界处理程序,以便每个人都能近乎实时地看到更新.现在我不知道如何为这些东西实现解码器.

我真的希望看到一些例子,说明如何实施它们.最好是一些说明....注意:我不是说为我解决这个问题但是告诉我如何处理不同的信息.最佳做法和标准请....

小智 4

人们编写自己的编码器/解码器(编解码器),因为 Netty 不强加也不定义应用程序级协议,因此您可以自由地编写自己的协议。您定义的编解码器集是一个协议,可以是基于字符串和某种二进制格式(例如 Protobuf)之间的任何协议。Netty 提供了编解码器以方便您使用(您使用的只是示例)。

我认为这是为了防止流过早被切断?

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

有一次,我实现了一个具有三个解码器的协议,这些解码器将按以下顺序执行:

  1. 接收流并将其分解为长度前缀的帧;
  2. 将每一帧转换为字符串;
  3. 使用 Jackson libray 将字符串转换为预定义的 Java 对象。

编码器只会执行相同的操作,但方向相反。不幸的是,我丢失了原始代码,但我很快就会重写它。

但是流如何知道流是一个 String 还是一系列 int 或一系列 double 呢?你如何告诉它差异是问题所在?

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

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