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

我不知道的部分是如何在HttpResponse上设置内容。它期望一个ChannelBuffer,但如何将对象放入ChannelBuffer?

编辑

说我有一个如下代码的处理程序,并有一个HttpContentEncoder,它知道如何序列化SomeSerializableObject。然后,如何将我的内容(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的意思,还是做压缩之类的事情?

最佳答案

大多数对象序列化/反序列化库使用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()可能会更简单。

08-04 20:17