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

2023-12-19

修改后的问题:

好的,所以我正在尝试将其合并到我自己的定制游戏中。我了解了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

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

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


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

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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有人可以更好地解释解码器/编码器吗? 的相关文章

随机推荐

  • 何时使用事件?

    在工作中 我们有一个庞大的框架 并使用事件将数据从其中的一个部分发送到另一部分 我最近开始了一个个人项目 我经常想到使用事件来控制我的对象的交互 例如 我有一个播放音效的 Mixer 类 我最初认为我应该接收事件来播放音效 然后我决定只让我
  • 为 VS UT Assert 类创建自定义扩展方法的最佳方法是什么?

    我想知道为 Microsoft Visual Studio 单元测试 Assert 类编写自定义扩展方法的最佳方法是什么 您可以为此创建扩展方法Assert https learn microsoft com en us dotnet ap
  • Matlab 中的克隆图 - 具有属性和数据

    我在 matlab 中编写了一个脚本 它可以生成一组数据 这些图形在格式方面应该非常相似 并且每个图形都应该显示一组数据 它是嵌入在 3D 域中的图形 这些图形中的每一个还应该显示该 3d 域内的一组粒子 所以我想创建第一个图形 然后制作它
  • 数千个多边形和 IE JavaScript 语句限制

    我正在编写一个应用程序 需要一次显示多达 4000 个多边形 其中一些具有数百个坐标 每个多边形都需要一个事件mouseover mouseout and doubleclick以及信息框标签 我最初遇到了 IE 8 中 JavaScrip
  • 为什么某些 HTML 元素可以使用 CSS 设置样式,但不能使用属性

    当我滚动浏览一些w3学校 https w3schools com我遇到了关于的文档部分inline元素和一个我以前从未真正思考过的问题 文档说如下 内联元素 An inline元素不会从新行开始 并且只占用所需的宽度 a a
  • 当子视图与 AVPlayer 重叠时移动字幕

    如果子视图 非本机 自定义播放器控件 出现在视频显示的系统标题上方 是否可以更改视频显示的系统标题 显示的字幕是文本 WebVTT 字幕 在某些屏幕尺寸上 当我切换到横向时 我们的自定义搜索栏控件会重叠显示在播放器底部的字幕 对于它的价值来
  • Angular Modal 服务不会使背景变灰

    我在 plunkur 有以下样本单击此处打开链接 http plnkr co edit GbeJbwwhwcs7plniPYth p preview var app angular module App ui bootstrap try a
  • 如何使用 AWSMobileClient 设置不同的配置 (awsconfiguration.json) 以进行调试和发布构建类型

    我想要不同的配置debug and release构建 所有配置都存储在里面awsconfiguration json 例如我有两个不同的配置文件 如何设置应使用哪个文件 使用时AWSMobileClient getInstance 它从文
  • Spring data jpa - 在执行前修改查询

    我正在开发一个在数据库中保存一些访问控制信息的项目 我们使用该访问控制信息来过滤用户可以看到的内容 我们使用的过滤器基于用户拥有的角色 我们希望使用 Spring Data 提供的存储库抽象 但我们希望能够在执行生成的查询之前对其进行调整
  • 使 Android Textview 或 EditText 可选择

    我要实现EditText or Textview在我的android项目中可以选择 项目适用于 android 4 0 我添加这个 txtView setTextIsSelectable true 并且 txtView setCustomS
  • 在 Python 中创建自签名 X509 证书

    我跟着this url https web archive org web 20161107073715 http blog richardknop com 2012 08 create a self signed x509 certifi
  • 彩色 Git diff 到 HTML

    我喜欢使用git diff color words要清楚地看到文件中已更改的单词 不过 我想与没有 git 或彩色终端的人分享这个差异 那么有人知道可以转换的工具或技巧吗颜色转义终端输出转换为 HTML wget http www pixe
  • 如何从 ASP.NET 页面获取当前登录的 Windows 帐户?

    我有一个使用 ASP NET 表单身份验证的 ASP NET 3 5 应用程序 我希望在页面中编辑数据时能够获取当前登录到计算机的 Windows 用户名 不是登录到 ASP NET 应用程序 而是登录到 Windows 如果我使用Cont
  • 如何在 Spring Boot 应用程序中使用 Thymeleaf 加载 HashMap 和 ModelandView 对象值?

    对于 Spring boot 应用程序 我无法使用 Thymeleaf 从 HTML 文件加载浏览器中的输入和实例值 下面是控制器 java 文件中的代码片段 RequestMapping value x public String lau
  • 验证 OpenSSL 0.9.8a 中的 RSA 签名

    我正在开发一个基于 OpenSSL 版本 0 9 8a API 的应用程序 我需要使用 RSA 公钥验证 RSA 签名 4096 位 RSA 密钥 pubkey 这是我的代码 const EVP MD md EVP get digestby
  • jQuery addClass() 添加到append() 之后生成的元素

    我正在尝试将一个类添加到新附加的 DIV 中 而不使用以下内容 t y append div class div 这是我正在尝试做的一个更好的例子 var t this this x each function i obj append n
  • 狗年到人年,反之亦然[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试这个示例问题 我必须创建两个隐式转换运算符才能从人类创建 Doggy 类 反之亦然 这些课程需要考虑到人类的一岁是狗的七岁这一事实
  • 将 log4j2 与 slf4j 一起使用:java.lang.StackOverflowError

    所以我尝试过以下this https stackoverflow com questions 25386651 slf4j log4j2 maven setup query 非 Maven 实现 及其要求web site https log
  • MySQL - 在 where 子句中引用聚合列

    这看起来很简单 但我似乎无法在不执行子查询的情况下弄清楚它 这似乎会显着减慢查询速度 需要几乎 10 秒而不是 假设我有一个已发送文档表 我想选择自上次发送以来已更新的文档以及从未发送过的文档 SELECT d document id ma
  • 有人可以更好地解释解码器/编码器吗?

    修改后的问题 好的 所以我正在尝试将其合并到我自己的定制游戏中 我了解了Netty服务器和客户端如何连接的过程 我还了解解码器和编码器在理论上是如何工作的 但这是我仍然想了解的 我的服务器进程 Server boots up gt Clie