Netty重复发送消息

chencliff 发布于 2011/09/08 11:34
阅读 3K+
收藏 0

当Netty服务器端对客户端连续发送消息的时候,会重复发送其中的一些消息,替代原有应该发送的消息:

比如我发送:

第0次发送信息
第1次发送信息
第2次发送信息
第3次发送信息
有时候接到的是:

第0次发送信息
第2次发送信息
第2次发送信息
第3次发送信息


代码应该都是正常操作代码:

public class CommServer {

       private final int PORT = 7878;   
    private final NioServerSocketChannelFactory factory = new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(),
            Executors.newCachedThreadPool());

      public CommServer() {        
            ServerBootstrap bootstrap = new ServerBootstrap(factory);
            bootstrap.setPipelineFactory(new CommServerPipelineFactory());
            bootstrap.setOption("child.tcpNoDelay", true);
            bootstrap.setOption("child.keepAlive", true);
            bootstrap.setOption("child.linger", 60);
            bootstrap.setOption("child.TIMEOUT", 120);
            Channel channel = bootstrap.bind(new InetSocketAddress(PORT));          
        }
    }

 

public class CommServerPipelineFactory implements ChannelPipelineFactory {

 private final ExecutionHandler executionHandler;

    public CommServerPipelineFactory() {
        this.executionHandler =new ExecutionHandler(Executors.newCachedThreadPool());
    }

    @Override
    public final ChannelPipeline getPipeline() throws Exception {

        ChannelPipeline pipeline = Channels.pipeline();
        
        pipeline.addLast("decoder", new CommDecoder());        
        pipeline.addLast("encoder", new CommEncoder());

        pipeline.addLast("execution",executionHandler);
        pipeline.addLast("handler", new CommServerHandler());
        return pipeline;
    }
}

public class CommServerHandler extends SimpleChannelHandler {

    @Override
    public final void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
         for (int i = 0; i < 100; i++) {
            ctx.getChannel().write("第"+i+"次发送信息");
        }
    }   
}

加载中
0
w
w超
求答案
huzorro
huzorro
他写的 CommServerHandler 继承的handler是一个即处理上游事件也处理下游事件的handler 也就是 编码前会执行该handler 解码后也会执行该handler 打印重复值就没什么奇怪的了
返回顶部
顶部