以往做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必将是你的最佳选择!
- 文章2302
- 用户1336
- 访客10962994
进步始于一次勇敢的迈步。