Netty入门
Netty
- ChannelEvent 某一事件
- ChannelPipeline 管道、传输途径。控制ChannelEvent事件传递和分发
- ChannelHandler 站点处理业务逻辑
- Channel 协调总部门
- EventLoopGroup 线程池调度处理各种数据
DEMO
Server
public class DemoServer {
private static final int port = 8888;
public static void main(String[] args) throws Exception {
EventLoopGroup mainGroup = new NioEventLoopGroup();
EventLoopGroup workGroup = new NioEventLoopGroup();
try{
ServerBootstrap boot = new ServerBootStrap();
//主从Reactor多线程模型
boot.group(mainGroup, workGroup);
//NIO传输
boot.channel(NioServerSocketChannel.class);
//handler处理流程
boot.childHandler(new DemoServerInitializer());
ChannelFuture f = boot.bind(port).sync();
f.channel().closeFuture().sync();
}finally{
mainGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
}
public class DemoServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//获取pipeline
ChannelPipeline pipeline = socketChannel.pipeline);
//解码器
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8000,Delimiters.lineDelimiter()));
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encode", new StringEncode());
pipeline.addLast("handler", new DemoHandler());
}
}
public classDemoHandler extends SimpleChannelInboundHandler<String> {
@Override
portected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
System.out.println(ctx.channel().remoteAddress() + "Msg:" + msg);
ctx.writeAndFlush("succ get msg \n");
}
//建立链接时触发
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.write("welcome to netty \n");
ctx.flush();
super.channelActive(ctx);
}
}
client端
public class DemoClient{
public static final String host = "127.0.0.1";
public static final String port = 8888;
public staic void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try{
BootStrap boot = new BootStrap();
boot.group(group).channel(NioSocketChannel.class).handler(new DemoClientInitializer());
Channel channel = b.connect(host, port).sync().channel();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for(;;) {
String line = in.readLine();
if(line == null) {
continue;
}
channel.writeAndFulsh(line + "\r\n");
}
}finally {
group.shutdownGracefully();
}
}
}
public class DemoClientInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline);
//解码器
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8000,Delimiters.lineDelimiter()));
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encode", new StringEncode());
pipeline.addLast("handler", new DemoClientHandler());
}
}
public class DemoClientHandler extends SimpleChannelInboundHanlder<String> {
//接收服务端的信息
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
System.out.println("Server msg : " + s);
}
//连接成功时触发
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("Client connect ");
super.channelActive(ctx);
}
//关闭时触发
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println("Client close ");
super.channelInactive(ctx);
}
}