Netty入门ITeye - 威尼斯人

Netty入门ITeye

2019-01-10 20:53:59 | 作者: 奥然 | 标签: 运用,功用,客户端 | 浏览: 2638

现在运用JDK的NIO类库进行开发问题较多如下:

1,NIO的类库和API冗杂,运用费事,需求熟练掌握Selector,ServerSocketChannel,SocketChannel,ByteBuffer等。

2,需求具有其他的额定技能做衬托,例如了解Java多线程编程。

3,牢靠功用力补齐,工作量和难度都非常大。

4,JDK NIO的BUG,如epoll bug,它会导致Selector空轮询,终究导致CPU 100%。

 

Netty是业界最盛行的NIO结构之一,它的健壮性,功用,功用,可定制性和可扩展性在同类结构中都是名列前茅的,现已得到成百上千的商用项目的验证。

Netty的长处总结如下:

API运用简略,开发门槛低。

功用强大,预置了多种编解码功用,支撑多种干流协议。

功用高,经过与其他业界干流的NIO结构比照,Netty的归纳功用最优。

老练,安稳,Netty修正了现已发现的一切JDK NIO BUG,事务开发人员不需求再为NIO的BUG而烦恼。

阅历了大规模的商业运用检测,质量得到验证。

 

Netty原理介绍

Netty是依据NIO的多线程规划的Reactors形式。添加线程扩展性,首要运用与多核处理器中。

Worker线程,Reactors要快速触发handlers。handlers的处理降低了Reactor的速度,需求将非I/O操作别离到其他线程中处理。

Reactor线程能够运用IO操作饱满,分布负载到其他reactors,负载均衡来匹配CPU和IO之间的速度差异。

 

原理图如下:

 

客户端代码如下:

 

package com.huawei.netty.test;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
 * Created by liuzhengqiu on 2017/10/15.
public class NettyClient
 public void connect(int port,String host) throws Exception
 EventLoopGroup group = new NioEventLoopGroup();
 Bootstrap bootstrap = new Bootstrap();
 bootstrap.group(group).channel(NioSocketChannel.class)
 .option(ChannelOption.TCP_NODELAY,true)
 .handler(new ChannelInitializer SocketChannel () {
 @Override
 protected void initChannel(SocketChannel socketChannel) throws Exception {
 socketChannel.pipeline().addLast(new NettyClientHandler());
 ChannelFuture f = bootstrap.connect(host,port).sync();
 f.channel().closeFuture().sync();
 finally {
 group.shutdownGracefully();
 public static void main(String[] args) throws Exception {
 new NettyClient().connect(8080,"127.0.0.1");

 

package com.huawei.netty.test;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
 * Created by liuzhengqiu on 2017/10/15.
public class NettyClientHandler extends ChannelInboundHandlerAdapter
 private final ByteBuf msg;
 public NettyClientHandler()
 byte[] req = "hello world".getBytes();
 msg = Unpooled.buffer(req.length);
 msg.writeBytes(req);
 @Override
 public void channelActive(ChannelHandlerContext ctx)
 ctx.writeAndFlush(msg);
 @Override
 public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception
 ByteBuf buf = (ByteBuf) msg;
 byte[] req = new byte[buf.readableBytes()];
 buf.readBytes(req);
 String body = new String(req,"UTF-8");
 System.out.println("Now is :"+body);


Netty服务端和客户端总结

netty服务端经过一个Map保存一切衔接上来的客户端SocketChannel,客户端的ID作为Map的Key。每次服务器端假如要向某个客户端发送音讯,只需依据ClientId取出对应的SocketChannel,往里面写入message即可。心跳检测经过IdleEvent事情,守时向服务器发送Ping音讯,检测SocketChannel是否终断。

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章