1、消息如何在管道中流转
当前的一个handler如何往下面的一个handler传递一个对象
一个管道中会有多个handler
handler往下传递对象的方法是sendUpstream(event)
服务端
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
//handler传递
pipeline.addLast("FirstHandler", new FirstHandler());
pipeline.addLast("SecondHandler", new SecondHandler());
return pipeline;
}
});
public class FirstHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
//第一个handler
ChannelBuffer buffer = (ChannelBuffer)e.getMessage();
byte[] array = buffer.array();
String message = new String(array);
System.out.println("FirstHandler:" + message);
//传递 发送到下一个Handler
// public UpstreamMessageEvent(Channel channel, Object message, SocketAddress remoteAddress)
ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "abc", e.getRemoteAddress()));
ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "def", e.getRemoteAddress()));
ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "ghn", e.getRemoteAddress()));
}
}
public class SecondHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
//这里接收从FirstHandler转发过来的请求
String message = (String)e.getMessage();
System.out.println("SecondHandler:" + message);
}
}
2、看下粘包和分包是怎么样一个情况
hello hello
hellohe llo
服务端接收到的数据不稳定
解决方法:
- 定义一个稳定的结构 length + hello
为什么FrameDecoder return的对象就是往下传递的对象 (还是调用了sendUpstream)
buffer里面数据未被读取完怎么办? (cumulation缓存)
为什么return null就可以缓存buffer (cumulation缓存)
FrameDecoder里面的cumulation其实就是一个缓存的buffer对象
把长度定义的很大,这种数据包,通常被称为socket攻击,字节流式攻击
解决方法传输的数据添加包头