IDEA 2018创建Netty工程——入门篇

Home / Article 百晓生 2019-3-24 5918

以往做Java开发基本上都是用eclipse,自从前几年安卓推出Android Studio2.0之后,就改用Android Studio了。因为速度之快,开发之便捷取得了广大程序猿的亲睐。而它也是基于IntelliJ IDEA开发的。拥有现在的maven仓库插件,不需要再像eclipse一样到处是找jar类库(尴尬的是很多jar库还在csdn上收取巨额的积分让新手门望而却步。),可以说是十分的方便,高效!

步入正题:首先安装好idea,我的是idea2018专业版。然后创建一个Java项目即可。如图

下一步,选项Hello,Java模板,可以少写一点代码。自创一个Main入口。下一步输入工程点:HelloNetty,点finish

此类还不能使用netty类库里面的工具类,右键工程

选项Add Framework Support,添加maven仓库支持

点完成之后,项目会多出一个HelloNetty.pom文件,先不管它。我们把设置改成用aliyun的,这样可以快速下载类库,毕竟maven服务器是在国外,很多被墙了。右键HelloNetty.pom,点maven->创建settings.xml文件,然后在这个空白文件添加以下内容

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
</settings>

然后完全退出idea再启动idea(此操作个人觉得退出生效,不然感觉一直在maven...)。打开HelloNetty.pom,弹出窗口记得选项启用自动导入功能,这个你只要输入netty它会自动帮你完成。

在内容下添加以下代码

这里说明一点,网上好多教程说是添加

<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>4.1.16.Final</version>
    </dependency>

对于刚接触的朋友肯定会被带到坑里面去,一定是先加dependencies标签(被网上教程省略掉),这个下面可以添加多个依赖项,最终代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>HelloNetty</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.16.Final</version>
        </dependency>
    </dependencies>
    
</project>

然后build工程,会自动下载类库,此时我们在前面自动创建的Main.java中引用netty工具类了。

public class NettyServer {
    public static void main(String[] args) {
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        NioEventLoopGroup boos = new NioEventLoopGroup();
        NioEventLoopGroup worker = new NioEventLoopGroup();
        serverBootstrap
                .group(boos, worker)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    protected void initChannel(NioSocketChannel ch) {
                        ch.pipeline().addLast(new StringDecoder());
                        ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                            @Override
                            protected void channelRead0(ChannelHandlerContext ctx, String msg) {
                                System.out.println(msg);
                            }
                        });
                    }
                })
                .bind(8000);
    }
}

这么一小段代码就实现了我们前面NIO编程中的所有的功能,包括服务端启动,接受新连接,打印客户端传来的数据,怎么样,是不是比JDK原生的NIO编程优雅许多?

初学Netty的时候,由于大部分人对NIO编程缺乏经验,因此,将Netty里面的概念与IO模型结合起来可能更好理解

1.boos对应,IOServer.java中的接受新连接线程,主要负责创建新连接

2.worker对应 IOClient.java中的负责读取数据的线程,主要用于读取数据以及业务逻辑处理

然后剩下的逻辑我在后面的系列文章中会详细分析,你可以先把这段代码拷贝到你的IDE里面,然后运行main函数

然后下面是客户端NIO的实现部分

public class NettyClient {
    public static void main(String[] args) throws InterruptedException {
        Bootstrap bootstrap = new Bootstrap();
        NioEventLoopGroup group = new NioEventLoopGroup();
        bootstrap.group(group)
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<Channel>() {
                    @Override
                    protected void initChannel(Channel ch) {
                        ch.pipeline().addLast(new StringEncoder());
                    }
                });
        Channel channel = bootstrap.connect("127.0.0.1", 8000).channel();
        while (true) {
            channel.writeAndFlush(new Date() + ": hello world!");
            Thread.sleep(2000);
        }
    }
}

在客户端程序中,group对应了我们IOClient.java中main函数起的线程,剩下的逻辑我在后面的文章中会详细分析,现在你要做的事情就是把这段代码拷贝到你的IDE里面,然后运行main函数,最后回到NettyServer.java的控制台,你会看到效果。

使用Netty之后是不是觉得整个世界都美好了,一方面Netty对NIO封装得如此完美,写出来的代码非常优雅,另外一方面,使用Netty之后,网络通信这块的性能问题几乎不用操心,尽情地让Netty榨干你的CPU吧。

目前我负责的两大长连接项目均峰值QPS在50W左右,单机连接数10W左右,集群规模在千万级别,底层均使用了Netty作为通信框架。Netty如此高性能及稳定的特性让我几乎不用为性能而担忧,所以,如果你工作中需要接触到网络编程,Netty必将是你的最佳选择!

本文链接:https://www.it72.com/12527.htm

推荐阅读
最新回复 (1)
返回