您当前的位置: 首页 >  nio

水的精神

暂无认证

  • 2浏览

    0关注

    711博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

一个超级简单的使用netty NIO实现服务端和客户端的栗子

水的精神 发布时间:2021-06-26 18:46:12 ,浏览量:2

前置条件

  1. IDEA开发工具
  2. maven管理依赖
  3. 熟悉了netty的核心组件,看这个案例会爽一点。如果不是很清楚,可以看我的这篇文章:netty全部核心组件 

  另外这个案例我直接使用的韩顺平老师的案例。因为我写也是一样,我们就是为了学习,能CV的代码我就不一个一个敲了。 这段代码本来注释已经比较多了,我自己也加了一部分的注释。

引入maven依赖

  先创建一个项目

  在pom引入依赖,轻松搞定,netty给我们准好了一个大而全的包,不需要额外的引入其他的包。


       io.netty
       netty-all
       4.1.20.Final

自定义服务端的处理逻辑代码

   一般自定义的逻辑代码,我们为了方便,都去继承netty的channelHanerAdapter。 这样可以省去一部分通用的功能的开发。如果你想要自己实现,也行。看下图channelHanerAdapter实际上也是实现了 ChannelInboundHandler接口。

  这实际上是一个适配器模式,来减轻我们自定义的业务逻辑接入netty的负担。

package netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelPipeline;
import io.netty.util.CharsetUtil;

/**
 * @author angus
 * @create 2021-06-26 12:57
 * 说明
 * 1. 我们自定义一个Handler 需要继续netty 规定好的某个HandlerAdapter(规范)
 * 2. 这时我们自定义一个Handler , 才能称为一个handler
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter{
	//读取数据实际(这里我们可以读取客户端发送的消息)
	/**
	 * 1. ChannelHandlerContext ctx:上下文对象, 含有 管道pipeline , 通道channel, 地址
	 * 2. Object msg: 就是客户端发送的数据 默认Object
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{

		System.out.println("服务器读取线程 " + Thread.currentThread().getName() + " channle =" + ctx.channel());
		System.out.println("server ctx =" + ctx);
		System.out.println("看看channel 和 pipeline的关系");
		Channel channel = ctx.channel();
		ChannelPipeline pipeline = ctx.pipeline(); //本质是一个双向链接, 出站入站

		//将 msg 转成一个 ByteBuf
		//ByteBuf 是 Netty 提供的,不是 NIO 的 ByteBuffer.
		ByteBuf buf = (ByteBuf) msg;
		System.out.println("客户端发送消息是:" + buf.toString(CharsetUtil.UTF_8));
		System.out.println("客户端地址:" + channel.remoteAddress());
	}

	//数据读取完毕
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		//writeAndFlush 是 write + flush
		//将数据写入到缓存,并刷新
		//一般讲,我们对这个发送的数据进行编码
		ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端~(>^ω^^ω^^ω^            
关注
打赏
1664074814
查看更多评论
0.0433s