首页 > 代码库 > Netty的socket编程(四)
Netty的socket编程(四)
Netty提供的handler:编解码,消息头,消息编码
1. 连接建立后,客户端和服务端都不会主动发消息,实现handler的channelActive来触发消息发送。
2.SimpleChannelInboundHandler的重载方法
(1)handlerAdded 连接建立时调用
(2)HandlerRemoved 连接断开时调用
(3)HandlerActive 连接处于活动状态调用
(4)HandlerInactive 连接处于不活动状态调用
socket示例 :
server启动类:
1 public class MyServer { 2 3 public static void main(String[] args) throws InterruptedException { 4 5 EventLoopGroup bossGroup = new NioEventLoopGroup(); 6 EventLoopGroup workerGroup = new NioEventLoopGroup(); 7 8 try{ 9 ServerBootstrap serverBootstrap = new ServerBootstrap(); 10 serverBootstrap.group(bossGroup,workerGroup). 11 channel(NioServerSocketChannel.class) 12 .childHandler(new MyServerInitializer()); 13 ChannelFuture channelFuture = serverBootstrap.bind(8899).sync(); 14 channelFuture.channel().closeFuture().sync(); 15 16 }finally { 17 18 bossGroup.shutdownGracefully(); 19 workerGroup.shutdownGracefully(); 20 21 } 22 23 } 24 25 }
server初始化类 :
1 public class MyServerInitializer extends ChannelInitializer<SocketChannel>{ 2 3 4 @Override 5 protected void initChannel(SocketChannel ch) throws Exception { 6 7 ChannelPipeline channelPipeline = ch.pipeline(); 8 9 //解码器 10 channelPipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); 11 //消息 加header 12 channelPipeline.addLast(new LengthFieldPrepender(4)); 13 channelPipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); 14 channelPipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); 15 channelPipeline.addLast(new MyServerHandler()); 16 17 } 18 }
server业务处理handler:
1 public class MyServerHandler extends SimpleChannelInboundHandler<String> { 2 @Override 3 protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { 4 5 System.out.println(ctx.channel().remoteAddress()+"msg:"+msg); 6 7 ctx.channel().writeAndFlush("from server "+ UUID.randomUUID()); 8 9 } 10 11 @Override 12 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 13 cause.printStackTrace(); 14 ctx.close(); 15 } 16 }
client 类:
client启动类:
1 public class MyClient { 2 3 public static void main(String[] args) throws InterruptedException { 4 5 EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); 6 7 try{ 8 Bootstrap bootstrap = new Bootstrap(); 9 bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) 10 .handler(new MyClientInitializer()); 11 12 ChannelFuture channelFuture = bootstrap.connect("localhost",8899).sync(); 13 channelFuture.channel().closeFuture().sync(); 14 }finally { 15 eventLoopGroup.shutdownGracefully(); 16 } 17 18 19 } 20 21 }
client初始化类 :
1 public class MyClientInitializer extends ChannelInitializer<SocketChannel>{ 2 @Override 3 protected void initChannel(SocketChannel ch) throws Exception { 4 ChannelPipeline channelPipeline = ch.pipeline(); 5 //解码器 6 channelPipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); 7 //消息 加header 8 channelPipeline.addLast(new LengthFieldPrepender(4)); 9 channelPipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); 10 channelPipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); 11 channelPipeline.addLast(new MyClientHandler()); //自己的处理器 12 } 13 }
client业务处理handler :
1 public class MyClientHandler extends SimpleChannelInboundHandler<String>{ 2 @Override 3 protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { 4 System.out.println(ctx.channel().remoteAddress()); 5 System.out.println("client output "+msg); 6 ctx.writeAndFlush("from client "+ LocalDateTime.now()); 7 8 } 9 10 @Override 11 public void channelActive(ChannelHandlerContext ctx) throws Exception { 12 ctx.writeAndFlush("来自客户端的问候!!"); 13 } 14 15 @Override 16 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 17 cause.printStackTrace(); 18 ctx.close(); 19 } 20 }
Netty的socket编程(四)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。