java - 将对象放入 ChannelBuffer

标签 java http netty

我按照 example http server 使用 Netty 编写了一个小型 http 服务器现在我正在尝试使其适应我的需求(一个应该发送 json 的小应用程序)。我首先使用 jackson 手动将 POJO 编码为 json,然后使用 StringEncoder 获取 ChannelBuffer。现在我尝试通过添加 HttpContentEncoder 来提取将 POJO 编码为 json 的位,从而对其进行稍微概括。我已经或多或少地实现了这一点。

我不明白的部分是如何设置 HttpResponse 上的内容。它需要一个 ChannelBuffer,但我如何将我的对象放入 ChannelBuffer 中?

编辑

假设我有一个具有如下代码的处理程序,并且有一个知道如何序列化 SomeSerializedObject 的 HttpContentEncoder。那么我如何将我的内容(SomeSerializedObject)获取到HttpContentEncoder?这就是我正在寻找的。

SomeSerializableObject obj = ...

// This won't work becuase the HttpMessage expects a ChannelBuffer
HttpRequest res = ...
res.setContent(obj);

Channel ch = ...
ch.write(res);

在进一步研究之后,我不确定这是否是 HttpContentEncoder 的目的,或者更确切地说是做压缩之类的事情?

最佳答案

大多数对象序列化/反序列化库使用InputStreamOutputStream。您可以创建一个动态缓冲区(或用于反序列化的包装缓冲区),用 ChannelBufferOutputStream (或 ChannelBufferInputStream)包装它以提供序列化库。例如:

// Deserialization
HttpMessage m = ...;
ChannelBuffer content = m.getContent();
InputStream in = new ChannelBufferInputStream(content);
Object contentObject = myDeserializer.decode(in);

// Serialization
HttpMessage m = ...;
Object contentObject = ...;
ChannelBuffer content = ChannelBuffers.dynamicBuffer();
OutputStream out = new ChannelBufferOutputStream(content);
mySerializer.encode(contentObject, out);
m.setContent(content);

如果序列化库允许您使用字节数组而不是流,则使用 ChannelBuffer.array()ChannelBuffer.arrayOffset() 可以更简单。

关于java - 将对象放入 ChannelBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592122/

相关文章:

spring - 配置 Netty 并将其嵌入到 Spring-Tomcat 环境中

java - 获取 json 文件中的条目数

java - Android 服务运行 Activity

java - JScrollPane 在顶部添加 JPanels 并保持当前 ScrollView

javascript - 使用 angular.js 和 php 在 $http 请求中的错误回调函数中遇到问题

java - Netty 作为高性能 Http 服务器每秒可处理约 2-3 百万个请求

java - Netty 4.0.27 HTTP over SSL(如在安全聊天示例中)对多个客户端失败

java - 简单的Java网络IO不适用于大数据

java - spring 拦截器不向@RestController 服务添加 header

security - 在 HEADER 或 URL 中传递 API key ?