Netty 系列知识分享
Posted 测试开发栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty 系列知识分享相关的知识,希望对你有一定的参考价值。
一、Netty是什么?
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
"快速"和"简单"并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。
二、为什么要学习Netty,Netty都能解决那些问题?
为什么要学习netty呢?
首先我学习java语言的同学们都知道java对socket编程的支持不是很好,而且随着网络技术的发展社会的进步科技的发展,我们会发现一个问题就是智能终端设备会越来越多,而多数硬件的智能设备都是使用的tcp/udp协议。java网络编程是以流的形式发送数据,而我们平时常用的io是阻塞式的流,这样就会有一个问题当我们需要多次通讯是怎么办?难道要多次连接吗?这样太浪费资源了,有的同学这时候会说java也有原生的nio啊,没错没错java确实是有原生的nio的,但是你是没用起来,用起来你就会发现真的好麻烦哦.而且自己能力不是很强的时候编码起来就会有很多问题。写起来会很痛苦的哦.这里呢只是举一个例子而已,Netty支持socket编程但不只限于socket哦,netty支持多种协议,甚至支持音视频开发的RTSP哦,哈哈是不是很吊,下面我们就看一下netty都只是哪些协议呢,我把官网的图放在下面。
Netty能解决哪些问题呢?
Netty可以解决上面说过的socket编程的问,像http ftp 等等的问题netty都可以进行更好的处理和解决的,netty主要是在异步和并发方面应用的更为多一些,因为这就是设计之初的核心思想。为什么netty这么好这么优秀很少有人用其开发http,netty开发的http就一定会比spring springboot等要做的好吗?netty开发出来的性能是一定会好一些的,但是为什么很少有人用呢?应为编码成本。一会我会在下面写一个简单的socket的服务端与客户端简单通信大家就会明白了
三、关于Netty的学习方法
关于学习方法:
对于我们编程方面的学习本人还是那句话未必刚学就要是有就钻牛角尖 非要知其然知其所以开始先跟敲让其跑起来 慢慢你会理解着为什么要这么做,就像你要开车,你非要知道这个汽车是怎么造出来的吗?当你开一段时间你自然明白了都是什么构造。后期真的是编码能力强了 去看源码都没问题,岂不更快,所以不要前期钻牛角尖搞的 浪费了大量的时间却还没搞懂。太得不偿失了,而且你可以试试你没接触过netty你上来先去看看源码,你都想放弃这个行业了。
四、实战
下面我们开始编写一个简单的客户端服务端程序:
首先是服务端启动部分:
package netty.demo_01;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioserverSocketChannel;
public class Server {
public static void main(String[] args) throws Exception{
EventLoopGroup boosgrop=new NioEventLoopGroup();
EventLoopGroup workgrop=new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap=new ServerBootstrap();
serverBootstrap.group(boosgrop,workgrop)
.channel(NioServerSocketChannel.class)
.childHandler(new ServerInitializer());
ChannelFuture channelFuture=serverBootstrap.bind(8899).sync();
channelFuture.channel().closeFuture().sync();
}finally {
boosgrop.shutdownGracefully();
workgrop.shutdownGracefully();
}
}
}
服务端处理器
package netty.demo_01;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class ServerHandler extends SimpleChannelInboundHandler<String> {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush("Hello hello big family good my name is Server");
} @Override
protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception {
System.out.println(s);
} @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
服务端初始化器
package netty.demo_01;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;public class ServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline=socketChannel.pipeline();
pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));
pipeline.addLast(new ServerHandler());
}
}
客户端启动
package netty.demo_01;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
public class Client {
public static void main(String[] args) throws Exception {
EventLoopGroup workgroup = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(workgroup)
.channel(NioSocketChannel.class)
.handler(new ClientInitializer());
ChannelFuture channelFuture = bootstrap.connect("localhost", 8899).sync();
channelFuture.channel().closeFuture().sync();
} finally {
workgroup.shutdownGracefully();
}
}
}
客户端处理器
package netty.demo_01;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class ClientHandler extends SimpleChannelInboundHandler<String> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception {
System.out.println("from is server :"+s);
ctx.writeAndFlush(s);
} @Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush("Hello hello big family good my name is Clien");
} @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
客户端初始化器
package netty.demo_01;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;
public class ClientInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline=socketChannel.pipeline();
pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));
pipeline.addLast(new ClientHandler());
}
}
运行效果图:
大家可以按照我的代码愉快的敲起来了,哈哈 试着运行一下看看 是否有一样的效果呢。这文章没有细化到步骤,每个步骤都是干嘛的,大家先不用想那么多,想让程序跑起来解决一些不必要错误,下篇文章我们想细化到步骤,每一步骤到是在干嘛。
以上是关于Netty 系列知识分享的主要内容,如果未能解决你的问题,请参考以下文章
「Netty系列」彻底弄清网络七层协议TCP/IPIPTCP(Netty前置一)
#私藏项目实操分享#Netty技术专题「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析
基础技术技术分享系列二:基于Netty的Tesla Gateway