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攻擊,字節流式攻擊
解決方法傳輸的數據添加包頭