Netty入门
1.Netty介绍
(1)百度百科介绍:
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。
(2)官网介绍:netty.io
Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.
(3)参考资料:
- 参考书籍:Netty实战(Norman Maurer & Marvin Allen Wolfthal)
- 参考官方文档:https://netty.io/wiki/user-guide.html
- 参考网址:https://ifeve.com/tag/netty/
2.程序功能概述
客户端向服务器发送HelloNetty-Server!
服务器向客户端返回Hello Netty-Client!
3.程序实现
服务端ChannelHandler
package com.xm.netty;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.CharsetUtil;public class ServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf in = (ByteBuf) msg;System.out.println("服务器接收:"+in.toString(CharsetUtil.UTF_8));in.clear();String str = "Hello Netty-Client!";in.writeBytes(str.getBytes());ctx.write(in);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);} @Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}}
服务端Server
package com.xm.netty;import java.net.InetSocketAddress;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel;public class Server {private final int port;public Server(int port) {this.port = port;}public static void main(String[] args) {int port = 8989;try {new Server(port).start();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private void start() throws InterruptedException {final ServerHandler serverHandler = new ServerHandler();EventLoopGroup group = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(group).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress( port)).childHandler(new ChannelInitializer() {@Overrideprotected void initChannel(Channel ch) throws Exception {ch.pipeline().addLast(serverHandler);}});ChannelFuture future = bootstrap.bind().sync();future.channel().closeFuture().sync();} finally {group.shutdownGracefully().sync();}}}
客户端ChannelHandler
package com.xm.netty;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.util.CharsetUtil;public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty-Server!",CharsetUtil.UTF_8));}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {System.out.println("客户端接收到消息:"+msg.toString(CharsetUtil.UTF_8));}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}}
客户端Client
package com.xm.netty;import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;public class Client {private final int port;private final String host;public Client(int port, String host) {this.port = port;this.host = host;}public static void main(String[] args) {String host = "127.0.0.1";int port = 8989;try {new Client(port, host).start();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private void start() throws InterruptedException {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).remoteAddress(host, port).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new ClientHandler());}});ChannelFuture future = bootstrap.connect().sync();future.channel().closeFuture().sync();} finally {group.shutdownGracefully().sync();}}}
导入依赖
<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>com.xm</groupId><artifactId>netty</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.16.Final</version> </dependency></dependencies> </project>
4.运行结果:
服务端:
服务器接收:Hello Netty-Server!
客户端:
客户端接收到消息:Hello Netty-Client!