public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println(Thread.currentThread().getName());
System.out.println("ctx = " + ctx);
System.out.println("ctx.channel() = " + ctx.channel());
System.out.println("ctx.pipeline() = " + ctx.pipeline());
Thread.sleep(7*1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("小子,以后跟我混就行了001\r\n", CharsetUtil.UTF_8));
System.out.println("end----------------");
ByteBuf buf = (ByteBuf) msg;
System.out.println("client:"+((ByteBuf) msg).toString(CharsetUtil.UTF_8));
System.out.println("address:"+ctx.channel().remoteAddress());
}
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ChannelFuture channelFuture = ctx.writeAndFlush(Unpooled.copiedBuffer("小子,以后跟我混就行了", CharsetUtil.UTF_8));
}
小子,以后跟我混就行了001
小子,以后跟我混就行了
这种其实还是阻塞了
怎么解决呢?
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println(Thread.currentThread().getName());
System.out.println("ctx = " + ctx);
System.out.println("ctx.channel() = " + ctx.channel());
System.out.println("ctx.pipeline() = " + ctx.pipeline());
ctx.channel().eventLoop().execute(()->{
try {
Thread.sleep(7*1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("小子,以后跟我混就行了001\r\n", CharsetUtil.UTF_8));
} catch (InterruptedException e) {
e.printStackTrace();
}
});
ctx.channel().eventLoop().execute(()->{
try {
Thread.sleep(5*1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("小子,以后跟我混就行了002\r\n", CharsetUtil.UTF_8));
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("end----------------");
ByteBuf buf = (ByteBuf) msg;
System.out.println("client:"+((ByteBuf) msg).toString(CharsetUtil.UTF_8));
System.out.println("address:"+ctx.channel().remoteAddress());
}
如果在这有个断点,那两个任务并不会先运行,卡在断点处了。
放开断点之后
小子,以后跟我混就行了
/127.0.0.1:12312
小子,以后跟我混就行了001
/127.0.0.1:12312
小子,以后跟我混就行了002
得到这样一个结果。是顺序执行。
这种其实是加快了客户端的速度。