以往做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必将是你的最佳选择!
- 文章2305
- 用户1336
- 访客11456179
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器