0

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

我无法弄清楚的部分是如何在HttpResponse上设置内容。它需要一个 ChannelBuffer,但我如何将我的对象放入 ChannelBuffer?

编辑

假设我有一个带有如下代码的处理程序,并且有一个知道如何序列化 SomeSerializableObject 的 HttpContentEncoder。那么我如何将我的内容(SomeSerializableObject)发送到 HttpContentEncoder?这就是我要找的。

SomeSerializableObject obj = ...

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

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

虽然我不确定这是否是 HttpContentEncoder 的目的,或者更确切地说是压缩之类的东西,但在对其进行了更多研究之后?

4

1 回答 1

3

大多数对象序列化/反序列化库使用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()and会更简单ChannelBuffer.arrayOffset()

于 2013-01-30T05:45:41.400 回答