如果您创建了这样的管道:
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
有没有办法从通常处理文本的管道中获取原始数据? 我真的很想这样做:
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
// Save data received from the server.
Object msg = e.getMessage();
byte[] rawdata = new byte[((ChannelBuffer)msg).readableBytes()];
((ChannelBuffer)msg).getBytes(0, rawdata);
tmpTarFile.write(rawdata);
}
频道主要是文字,但有时我需要阅读原始二进制文件。 在这种情况下,由于管道中的StringDecoder,进入的msg是一个String对象。我想在该字符串下面获取channelbuffer数据......
在服务器端,数据是用这样写的:
ChannelBuffer databuffer = ChannelBuffers.buffer(blobstream.size());
databuffer.writeBytes(blobstream.toByteArray());
e.getChannel().write(databuffer);
看起来我必须关闭stringencoder / decoder(将其转换为带有原始字节访问的ChannelBuffer)并将字节转换为/从字符串...
答案 0 :(得分:0)
如果你想获得原始的ChannelBuffer,你需要从管道中删除Decoder,然后一旦你想再次处理String,就把它添加回来。
您还可以扩展StringDecoder并根据某些逻辑对其进行解码。 这样的事情:
public class FlexibleStringDecoder extends StringDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
if (decodeToString(msg)) {
return super.decode(ctx, channel, msg);
}
return msg;
}
public boolean decodeToString(Object msg) {
// Add some logic here....
return true;
}
}