fix:netty入栈出栈

上级 fd60895c
package com.kwan.shuyu.demo;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;
import java.net.InetSocketAddress;
/**
* 客户端
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/4/23 16:42
*/
public class Client {
public static void main(String[] args) throws InterruptedException {
//1.启动类
new Bootstrap()
// 2.添加 EventLoop
.group(new NioEventLoopGroup())
//3.选择客户端channel实现
.channel(NioSocketChannel.class)
// 4.添加处理器
.handler(new ChannelInitializer<NioSocketChannel>() {
@Override //在连接建立后被调用
protected void initChannel(NioSocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
}
})
//连接到服务器
.connect(new InetSocketAddress("localhost", 8080))
.sync()
.channel()
//发送数据
.writeAndFlush("hello world")
;
}
}
\ No newline at end of file
package com.kwan.shuyu.demo;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class EchoExceptionHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
super.channelRead(ctx, msg);
throw new RuntimeException("抛出入站异常了");
}
}
\ No newline at end of file
package com.kwan.shuyu.demo;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import io.netty.util.CharsetUtil;
public class EchoOutSelfHandler extends ChannelOutboundHandlerAdapter {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
System.out.println("执行1");
super.write(ctx, msg, promise);
ctx.write(Unpooled.copiedBuffer("Netty rocks from Server!", CharsetUtil.UTF_8));
promise.setSuccess();
promise.addListener((ChannelFutureListener) future -> {
if (future.isSuccess()) {
System.out.println("消息出站了");
} else {
future.cause().printStackTrace();
}
});
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
System.out.println("im in");
cause.printStackTrace();
}
}
\ No newline at end of file
package com.kwan.shuyu.demo;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
@ChannelHandler.Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf in = (ByteBuf) msg;
System.out.println("Server received:" + in.toString(CharsetUtil.UTF_8));
//入栈处理器最后的写入,供出栈处理器读取 ctx.channel()相当于 NioSocketChannel ch
ctx.channel().writeAndFlush(ctx.alloc().buffer().writeBytes(msg.toString().getBytes()));
}
}
package com.kwan.shuyu.demo;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
/**
* 测试pipeline,入栈和出栈
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/4/27 02:45
*/
@Slf4j
public class Server {
public static void main(String[] args) {
EchoServerHandler serverHandler = new EchoServerHandler();
new ServerBootstrap()
.group(new NioEventLoopGroup())
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline()
// .addLast(new EchoExceptionHandler())
.addLast(serverHandler)
.addLast(new EchoOutSelfHandler());
// // 1.通过 channel 拿到 pipeline
// //添加处理器head->h1->h2->h3->h4->h5->h6->tail
// ChannelPipeline pipeline = ch.pipeline();
// //2. 添加处理器head -> h1 -> tail
// pipeline.addLast("h1", new ChannelInboundHandlerAdapter() {
// @Override
// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// log.info("1");
// ByteBuf buf = (ByteBuf) msg;
// final String name = buf.toString(Charset.defaultCharset());
// super.channelRead(ctx, name);
// }
// });
// pipeline.addLast("h2", new ChannelInboundHandlerAdapter() {
// @Override
// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// log.info("2");
// final Student student = new Student(msg.toString());
// super.channelRead(ctx, student);
// }
// });
// pipeline.addLast("h3", new ChannelInboundHandlerAdapter() {
// @Override
// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// log.info("3");
// log.info("h3结果{},class={}", msg, msg.getClass());
// //入栈处理器最后的写入,供出栈处理器读取
// ch.writeAndFlush(ctx.alloc().buffer().writeBytes("server...".getBytes()));
// }
// });
// pipeline.addLast("h4", new ChannelOutboundHandlerAdapter() {
// @Override
// public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
// log.info("4");
// super.write(ctx, msg, promise);
// }
// });
// pipeline.addLast("h5", new ChannelOutboundHandlerAdapter() {
// @Override
// public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
// log.info("5");
// super.write(ctx, msg, promise);
// }
// });
// pipeline.addLast("h6", new ChannelOutboundHandlerAdapter() {
// @Override
// public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
// log.info("6");
// super.write(ctx, msg, promise);
// }
// });
}
}).bind(8080);
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册