- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在评估 Netty 以处理 Java 客户端与 C++ 服务器集成的套接字通信。消息传递协议(protocol)具有以下结构 -
public class CisPacketDecoder extends LengthFieldBasedFrameDecoder
{
public CisPacketDecoder(int maxFrameLength, int lengthFieldOffset,
int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) {
super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment,
initialBytesToStrip);
}
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf)
throws Exception
{
CisMessage message = null;
int type = buf.getInt(0); //Type is always first int
CisMessageType messageType = CisMessageType.fromIntToType(type);
if(messageType != null)
{
message = messageType.getObject();
if(message != null)
{
message.decode(buf.toByteBuffer());
}
else
{
System.out.println("Unable to create message for type " + type);
}
}
//mark the Channel buf as read by moving reader index
buf.readerIndex(buf.capacity());
return message;
}
}
public class PmcPipelineFactory implements ChannelPipelineFactory
{
@Override
public ChannelPipeline getPipeline() throws Exception
{
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("encoder", new CisPacketEncoder());
pipeline.addLast("decoder", new CisPacketDecoder(1024, 8, 4, -12, 0));
pipeline.addLast("handler", new MsgClientHandler());
return pipeline;
}
}
最佳答案
您需要调用 super.decode(..) 并在 decode(..) 方法中对返回的 ChannelBuffer 进行操作。
所以它会是这样的;
public class CisPacketDecoder extends LengthFieldBasedFrameDecoder {
public CisPacketDecoder(int maxFrameLength, int lengthFieldOffset,
int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) {
super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment,
initialBytesToStrip);
}
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf)
throws Exception {
// THIS IS IMPORTANT!!!!!
ChannelBuffer decoded = (ChannelBuffer) super.decode(ctx, channel, buf);
if (decoded == null) {
return null;
}
// NOW ONLY OPERATE ON decoded
CisMessage message = null;
int type = decoded.getInt(0); //Type is always first int
CisMessageType messageType = CisMessageType.fromIntToType(type);
if(messageType != null) {
message = messageType.getObject();
if(message != null) {
message.decode(decoded.toByteBuffer());
} else {
System.out.println("Unable to create message for type " + type);
}
}
return message;
}
}
关于netty - 从 LengthFieldBasedFrameDecoder 返回的缓冲区太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14352450/
我目前正在评估 Netty 以处理 Java 客户端与 C++ 服务器集成的套接字通信。消息传递协议(protocol)具有以下结构 - (Type)(SubType)(Length)(Message
我正在使用基于帧的解码器对 netty 管道进行单元测试。如果我使用小于最大帧的缓冲区大小,那么看起来帧是不正确的。我正在测试一个包含两条消息的文件。长度字段是第二个工作,包括整个消息的长度,包括长度
我考虑了一段时间,我为什么要使用 LengthFieldPrepender和 LengthFieldBasedFrameDecoder在 TCP 连接中? 我不明白为什么我唯一的想法是确保数据正确传输
我正在使用 Netty 处理一个协议(protocol),该协议(protocol)的消息在 header 中具有可变长度字段。 LengthFieldBasedFrameDecoder 被证明是满足
我在一个 API 中为 Netty 设置了这个参数,我需要通过 TCP(启用 SSL)向其发送数据。 LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4)
我正在使用 Netty 4.0.33-Final 中的 LengthFieldBasedFrameDecoder 类。 我正在开发的软件无需 Netty 的帮助即可与电视进行通信,因此我在这里以非常规
我是一名优秀的程序员,十分优秀!