如何使用 netty 通过 HTTP 传输响应

2024-01-05

我正在使用 Netty 3.6.6,我想向调用者发送一个大的响应。我无法将响应正文复制到 ChannelBuffer 中,因为在某些情况下它会非常大。

我正在将服务器从CXF迁移到Netty,以前,我只能使用CXF提供的OutputStream来写入数据。

我最初尝试只发送不带内容的响应,然后继续将数据写入一系列 8k 缓冲区中的 Channel。这失败了,因为客户似乎得到了原始响应,但看不到数据并抱怨。我尝试将响应设置为分块,但这似乎没有什么区别,设置分块标头也没有什么区别,客户端总是看到一个空流。

我看到了 3.6.6 的文件服务器示例,这与我想要做的类似,只是数据不是文件。我看到了 ChunkedStream 和 NioStream,它们似乎与我需要的很接近,除了它们采用 InputStream/ReadableByteChannel 而我有一个 OutputStream;我可以尝试使用 PipedInput 和 OutputStreams,但这似乎会引入一个不幸的瓶颈。

我确信有一种方法可以将大量数据流回客户端以响应请求,但我只是不知道如何做到这一点,除非我有一个文件。

我也很好奇,如果连接保持活动状态,并且您正在流式传输内容,但不知道内容长度,如何让客户端知道响应已完成。在这些情况下,客户端似乎会永远等待连接关闭。

修改 3.6.6 中的静态文件服务器示例以删除内容长度标头(只需将其注释掉),指定其为分块响应

   response.setChunked(true);
   response.setHeader(Names.TRANSFER_ENCODING, Values.CHUNKED);

然后使用ChunkedNioStream写入响应后发送文件:

    // Write the initial line and the header.
    ch.write(response);

    final ReadableByteChannel aIn = java.nio.channels.Channels.newChannel(new FileInputStream(file));
    ChannelFuture writeFuture = ch.write(new ChunkedNioStream(aIn));

产生不良行为,客户端收到几百个字节,然后停止接收,基本上就是我在应用程序中看到的情况。正确的事情似乎只发生在内容长度上,这在我的用例中是不可行的。


当你尝试写一个ChunkedNioStream to ChunkedWriteHandler,它仅仅产生一个包含内容的流ChunkedNioStream only。也就是说,它产生ChannelBuffers 而不是HttpChunks.

Because HttpMessageEncoder仅手柄HttpMessage and HttpChunk, ChannelBuffer由。。。生产ChunkedNioStream被绕过到线路,没有预先添加 HTTP 块标头,导致您的浏览器感到困惑。

要解决这个问题,您必须实现自己的ChunkedInput产生HttpChunks 而不是ChannelBuffers。然而,我必须同意这可能是一项具有挑战性的任务,所以你可能只想分叉HttpMessageEncoder让它也明白ChannelBuffer并像对待它一样HttpChunk。请看一下这部分 https://github.com/netty/netty/blob/netty-3.7.0.Final/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageEncoder.java#L103 of HttpMessageEncoder了解更多信息。

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

如何使用 netty 通过 HTTP 传输响应 的相关文章

  • Netty UDP 服务器引导程序

    我发现 Netty 4 0 的所有 TCP 服务器实现都使用 ServerBootstrap 实例 服务器和客户端之间最大也是唯一的区别 Netty的不同之处在于Bootstrap和Channel的实现是不同的 用过的 请看一下下面的代码
  • netty源码:(3) ThreadPerTaskExecutor

    这个类封装了一个ThreadFactory 同时提供了一个execute方法 用来把Runnable提交给ThreadFactory来执行
  • netty源码:(24)EventExecutorChooserFactory类

    该类定义了一个内部接口EventExecutorChooser 该接口有一个方法 next EventExecutorChooserFactory类有个默认实现类 DefaultEventExecutorChooserFactory 该类有
  • 从 netty ByteBuf 获取字符串

    如何从netty中获取字符串ByteBuf 到目前为止 我能够逐个字符地获取它 有没有办法直接获取字符串对象 message is of type ByteBuf for int i 0 i lt message capacity i by
  • Netty closeFuture().sync().channel();块休息 API

    我正在学习 Netty 并开始使用 Spring Boot 一些教程 我的目标是创建一个应用程序 该应用程序设置一个 TCP 端口来接收消息并通过 REST API 呈现它们 大多数教程都说我应该添加这样的东西 serverChannel
  • 以编程方式关闭 netty

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

    我有一个 netty 通道 我想在底层套接字上设置超时 默认设置为 0 超时的目的是 如果 15 分钟内没有发生任何事情 则未使用的通道将被关闭 虽然我没有看到任何配置可以这样做 而且套接字本身也对我隐藏 Thanks 如果使用ReadTi
  • OOM 使用 320 x 16MB Netty DirectByteBuffer 对象杀死了 JVM

    我在 7 5GB RAM 服务器 无交换 中运行一个应用程序 参数如下 Xmx3g Xms3g Xlog gc XX UseG1GC XX MaxGCPauseMillis 1000 XX MaxDirectMemorySize 500m
  • 分析 Netty 性能

    我正在编写一个 Netty 应用程序 该应用程序在 64 位八核 Linux 机器上运行 Netty 应用程序是一个简单的路由器 它接受请求 传入管道 从请求中读取一些元数据并将数据转发到远程服务 传出管道 该远程服务将向传出管道返回一个或
  • 更改 Netty 4 HTTP 文件服务器示例以使用 ChunkedStream 而不是 ChunkedFile

    我正在尝试用 Netty 4 方式实现 HTTP 服务器 当总数据大小未知时 使用分块传输编码为 HttpResponses 主体提供服务 作为起点 我只是更改了 HttpStaticFileServerHandler 可在https gi
  • Netty-无法访问类 jdk.internal.misc.Unsafe

    当我将 Java 从 8 升级到 11 时 我收到来自 Netty 的错误 jdk internal misc Unsafe 详细信息如下 我知道这是一条调试级别消息 我可以更改日志级别以忽略它 但我不确定当我忽略它时是否会出现其他问题 例
  • 使用 Netty 的异步 HTTP 客户端

    我是 Netty 新手 仍在努力寻找自己的方法 我正在寻找创建一个异步工作的 http 客户端 http的netty例子只展示了如何等待IO操作 并没有展示如何使用添加监听器 所以最近几天我一直在努力解决这个问题 我正在尝试创建一个请求类
  • 为什么JDK NIO使用这么多anon_inode文件描述符?

    我正在使用 Sun 的 JDK 1 6 0 26 和 NIO 带有 Netty 在 lsof 中我看到数百个文件描述符anon inode lsof np 11225 fgrep w anon inode java 11225 nobody
  • 将无符号类型写入 Netty ChannelBuffer

    Netty 的 ChannelBuffer 类提供了从 ChannelBuffer 读取无符号类型的便捷方法 但是似乎没有任何等效的方法用于将无符号类型写入 ChannelBuffer 我觉得我一定错过了什么 推荐的方法是什么 例如将无符号
  • Netty 处理程序未调用

    我正在尝试使用简单的服务器客户端应用程序进入 Netty 代码见下文 我正在努力解决两个问题 ConfigServerHandler 分别ConfigClientHandler 被正确调用 但是 FeedbackServerHandler
  • 不同的 Netty 版本及其用途

    我现在使用Netty有一段时间了 但永远无法解决这个问题 一个人可以下载四个不同的版本 其中三个正在积极开发中 3 x 4 0 x 4 1 x 5 x 据我了解 3 x 适用于 JRE 1 5 而 JRE 的其他所有版本都高于此版本 我使用
  • Netty:正确关闭 WebSocket

    如何从服务器端正确关闭 WebSocket 通道 连接 如果我使用一个ctx getChannel close the onerror在浏览器 Firefox 9 中抛出 页面加载时与 ws localhost 8080 websocket
  • 使用 Play WS 并获取 java.net.ConnectException:Amazon Cloudfront 上的握手超时

    在我的 Play 应用程序中 我需要从 Amazon Cloudfront 下载大量文件 使用 SSL 我在链接上随机收到以下错误 play api http HttpErrorHandlerExceptions anon 1 Execut
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • Netty通道读取混乱

    我三个月前开始使用 Netty 最初 它看起来非常简单且易于使用 因为我遵循了 4 x 系列主页中给出的示例 当我更深入地探索它时 我无法理解某些事件或回调名称 例如 我无法理解以下内容之间的区别 ChannelRead ChannelHa

随机推荐

  • pytest 夹具的多个副本

    假设我有一个如下所示的简单装置 使用 pytest django 但它也适用于 pytest pytest fixture def my thing request db thing MyModel objects create reque
  • 需要将这个相对简单的 docker pull 和 run 命令转换为 docker-compose.yml 文件吗?

    我使用三个命令来 更新 重新运行 然后通过我们选择的 CI 工具 Jenkins 清理 我当前的 docker 映像 为了简单起见 我没有包含 容器停止和删除 命令 docker pull my private registry 443 m
  • Windows下是否可以通过Docker镜像访问硬件设备?

    最近 一个原生 Docker 客户端 https docs docker com windows step one Windows 版已发布 gt Windows 7 我想知道 是否可以转发对运行 Windows 作为主机的物理设备的访问
  • Gridview 将 BoundField 的值设置为 Visible=False

    如何获取设置为 Visible false 的字段的值 如下
  • 在 winforms 中创建可点击的 C# 图像映射

    我正在尝试开发一个基本的 C winforms 应用程序 以可点击的图像地图作为其焦点 也就是说 某个部分可单击并将打开一个新表单的图像 例如 图像可以是棋盘 单击某个方块将执行打开新表单的操作 我希望这个概念是清楚的 我在 S O 上看过
  • 有没有办法在 Rails 3.1 中检测用户代理[重复]

    这个问题在这里已经有答案了 可能的重复 自动检测移动浏览器 通过用户代理 https stackoverflow com questions 1005153 auto detect mobile browser via user agent
  • 在 csproj 中将程序集标记为 CLSCompliant

    对此的回复question https stackoverflow com questions 42810705 visual studio 2017 and the new csproj internalsvisibleto解释了如何设置
  • 如何使用PhoneGap读写内部数据库?

    我有一个内部 SQLite DB Assets 我在其中存储了 100 个用户名和相应密码的文件夹 我如何通过phoneGap 访问它 我读过了 http docs phonegap com en 1 6 1 cordova storage
  • Selenium Webdriver - 等待页面在 Java&JavaScript(ajax/jquery/animation 等)中完全加载

    我正在尝试构建一种更好的方法来等待每次单击后加载页面 目前我使用的是这样的 public boolean waitForJSandJQueryToLoad WebDriverWait wait new WebDriverWait webDr
  • 按密度拆分的 APK 仍包含所有资源

    我决定尝试 apk sliptting 来减小 apk 的大小 我将以下内容添加到我的 gradle 构建文件中 splits Configures multiple APKs based on screen density density
  • 闪存记录 API

    谁能为 Flash AIR Flex 推荐一个好的 AS3 日志记录 API 除了编码事件之外 我还需要一些东西来捕获和记录鼠标和键盘事件 最好是有详细记录 支持的东西 提前致谢 我一直在使用霹雳 http code google com
  • 使用composer只需要1个文件?

    是否可以只需要 Composer 包中的 1 个文件 我只需要包中的 1 个或几个文件 当我只使用几个文件时 要求包含数百个文件的整个包是毫无意义的 可以通过作曲家来做到这一点吗 可以使用以下命令将特定文件包含在当前包中files自动加载策
  • Coredata非常慢;迅速

    我制作了一个 iOS 应用程序来跟踪设备的 GPS 路线 问题是 当我跟踪超过 5 分钟时 coredata 需要很长时间才能保存 我保存一个名为会话的对象 会话有很多位置对象 位置对象是 纬度 经度 会话对象看起来像 名称 string
  • Google Play Billing:如何模拟“帐户保留”状态(在调试/沙盒模式下)

    2020 年 11 月之前 Google Play 上的 Android 应用必须管理 帐户保留 状态 https developer android com distribute play policies https developer
  • AWS Fargate 中的文件

    是否可以在 Fargate 中实际写入 编辑 删除文件 由于它是无服务器的并且实际上没有文件系统 对此我无法得到明确的答案 例如 我们的一个客户需要在本地容器上写入一些临时缓存文件 这可能吗 我不想为此设置整个数据容器卷 Thanks Fa
  • 反序列化期间忽略属性

    我有一个非常好的序列化类 终于 现在我想向此类添加一个属性 但我根本不想将其序列化 是否可以添加带有某种属性的新属性 以便当我调用序列化或反序列化方法时 该属性将被忽视 XmlIgnore public int DoNotSerialize
  • 您最常重用的课程是什么?

    一段时间后 每个程序员都会得到一组实用程序类 其中一些是真正的编程珍珠 并且可以在您的多个项目中重复使用 例如 在java中 class Separator private String separator private boolean
  • php中如何将多个数组混合到一个数组中

    我正在从数据库获取数组 但它创建了多个数组 我只需要数据库中的一个数组 现在我只想从多个数组创建一个数组 我从数据库中获取了数组 Array 0 gt Array 0 gt 1 pro ref id gt 1 1 gt Array 0 gt
  • 通过 MinGW 上的 Swig/Python 以二进制模式使用 C++ 标准流

    我有一个用 C 编写的库 它使用标准流来读取和写入对象 我还有一个用 Swig 生成的 Python 接口 我用它来访问该库 在 Linux 上一切正常 但在 Windows 在 MinGW 上 上似乎不可能通过 Python 接口以二进制
  • 如何使用 netty 通过 HTTP 传输响应

    我正在使用 Netty 3 6 6 我想向调用者发送一个大的响应 我无法将响应正文复制到 ChannelBuffer 中 因为在某些情况下它会非常大 我正在将服务器从CXF迁移到Netty 以前 我只能使用CXF提供的OutputStrea