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

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(使用前将#替换为@)

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

  • netty源码:(3) ThreadPerTaskExecutor

    这个类封装了一个ThreadFactory 同时提供了一个execute方法 用来把Runnable提交给ThreadFactory来执行
  • netty-daxin-4(http&websocket)

    文章目录 http 服务端 NettyHttpServer HelloWorldServerHandler 客户端 ApiPost
  • netty源码:(28)ChannelPromise

    ChannelPromise是ChannelFuture的子接口 它是可写入的 其父接口Promise定义如下 ChannelPromise有个默认的实现类 DefaultChannelPromise 它的setSuccess方法用来调用所
  • 从 netty ByteBuf 获取字符串

    如何从netty中获取字符串ByteBuf 到目前为止 我能够逐个字符地获取它 有没有办法直接获取字符串对象 message is of type ByteBuf for int i 0 i lt message capacity i by
  • 以编程方式关闭 netty

    我正在使用 netty 4 0 24 Final 我需要以编程方式启动 停止 netty 服务器 启动服务器时 线程被阻塞在 f channel closeFuture sync 请帮助提供一些如何正确执行的提示 下面是 Main 类调用的
  • 在 netty 通道上设置套接字超时

    我有一个 netty 通道 我想在底层套接字上设置超时 默认设置为 0 超时的目的是 如果 15 分钟内没有发生任何事情 则未使用的通道将被关闭 虽然我没有看到任何配置可以这样做 而且套接字本身也对我隐藏 Thanks 如果使用ReadTi
  • 使用 Netty 的多线程 UDP 服务器

    我正在尝试使用 Netty 实现 UDP 服务器 这个想法是只绑定一次 因此只创建一个Channel This Channel仅使用一个处理程序进行初始化 该处理程序通过一个线程在多个线程之间分派传入数据报的处理ExecutorServic
  • Netty的并发编码

    编码器的encode方法会并发执行吗 我观察到编码方法可能是由不同线程并发的 管道定义为 Channels pipeline idleHandler new AmfDecoder
  • Netty 支持哪个 TLS 版本? TLS 1.0、1.1 还是 1.2?

    Netty 支持哪个 TLS 版本 TLS 1 0 1 1 还是 1 2 我在看http netty io 5 0 xref io netty handler ssl SslHandler html http netty io 5 0 xr
  • 分析 Netty 性能

    我正在编写一个 Netty 应用程序 该应用程序在 64 位八核 Linux 机器上运行 Netty 应用程序是一个简单的路由器 它接受请求 传入管道 从请求中读取一些元数据并将数据转发到远程服务 传出管道 该远程服务将向传出管道返回一个或
  • 使用多个线程处理单个连接

    我有 3 个异步服务器和客户端 它们像一条链一样相互连接 一个请求会经过 3 个系统 例如 gt System 1 gt System 2 gt System 3 gt 和回应 gt System 3 gt System 2 gt Syst
  • 如何在Java中解码http POST数据?

    我正在使用 Netty 并且必须接受并解析 http POST 请求 据我所知 Netty 没有内置对 POST 的支持 只有 GET 的支持 这是一个相当低级的库 处理原始网络操作 使用 servlet 容器 开箱即用地完成所有这些工作
  • JBoss Netty 与 JSON

    我希望我的 Ajax 代码能够通过 Netty 连接服务器 为此 我需要在服务器端 Netty 处理程序中使用 JSON 解码器和编码器 是否有任何开箱即用的实现 或者我应该编写自己的实现 Thanks Gil 据我所知 没有内置的 JSO
  • Netty 4. ByteToMessageCodec之后的并行处理

    If a NioEventLoopGroup被用作workerGroup 之后的消息ByteToMessageDecoder处理程序 对于单个连接 通过以下处理程序以顺序 单线程 方式处理NioEventLoop 是否有可能让它们在之后由另
  • 为什么我们真的需要多个 Netty boss 线程?

    我真的很困惑老板组的线程数量 我无法弄清楚我们需要多个老板线程的场景 在Boss 组是否需要多个线程 https stackoverflow com questions 22280916 do we need more than a sin
  • 如何用Java处理来自客户端的Websocket消息?

    我正在使用 Websocket 用 Ja va 开发客户端 服务器应用程序 目前 所有客户端消息均使用 switch case 进行处理 如下所示 OnMessage public String onMessage String unscr
  • 使用 Play WS 并获取 java.net.ConnectException:Amazon Cloudfront 上的握手超时

    在我的 Play 应用程序中 我需要从 Amazon Cloudfront 下载大量文件 使用 SSL 我在链接上随机收到以下错误 play api http HttpErrorHandlerExceptions anon 1 Execut
  • 使用 Netty 将 websocket 与在 tomcat 中运行的 Spring Web 应用程序集成

    我有一个使用 Netty 的 Web 套接字服务器实现 例如监听端口 8081 和一个在 Tomcat 中运行的单独的 Spring Web 应用程序 在端口 80 中运行 我想以某种方式将所有来自 localhost 80 Websock
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • Spring WebFlux Netty SSL 与自签名证书错误

    我正在尝试使用服务器端的自签名证书通过本地主机中的 https 访问在 Netty 上运行的 Spring Boot 应用程序 My application properties看起来像这样 server ssl enabled true

随机推荐

  • 何时使用事件?

    在工作中 我们有一个庞大的框架 并使用事件将数据从其中的一个部分发送到另一部分 我最近开始了一个个人项目 我经常想到使用事件来控制我的对象的交互 例如 我有一个播放音效的 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