1.定义:
Netty是一个NIO客户端服务器框架,可以快速简单地开发协议服务器和客户端等网络应用程序。它极大地简化和简化了TCP和UDP套接字服务器等网络编程。
“快速而简单”并不意味着由此产生的应用程序将受到可维护性或性能问题的困扰。Netty的设计经验非常丰富,包括FTP,SMTP,HTTP以及各种基于二进制和文本的传统协议。因此,Netty已经成功地找到了一个方法来实现轻松的开发,性能,稳定性和灵活性,而没有妥协
2. HelloWorld
- 一个简单的Netty程序,包含服务器端server和客户端client,下面直接上代码…
- pom
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.19.Final</version>
</dependency>
package Netty
import io.netty.bootstrap.ServerBootstrap
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.NioServerSocketChannel
import io.netty.handler.codec.string.StringDecoder
import io.netty.handler.codec.string.StringEncoder
import java.net.InetSocketAddress
public class NettyServer {
public void start(int port){
EventLoopGroup bossGroup = new NioEventLoopGroup(1)
EventLoopGroup workerGroup = new NioEventLoopGroup()
try {
ServerBootstrap bootstrap = new ServerBootstrap()
bootstrap.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class) //在这里,我们指定使用NioServerSocketChannel类来实例化一个新的Channel(通道)来接受传入的连接。
.childHandler(new ChannelInitializer<SocketChannel>() { //设置服务器处理程序
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("decoder", new StringDecoder())
ch.pipeline().addLast("encoder", new StringEncoder())
ch.pipeline().addLast(new NettyServerHandler())
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true)
ChannelFuture future = bootstrap.bind(port).sync()
System.out.println("netty Server port : " + port )
future.channel().closeFuture().sync()
} catch (Exception e) {
bossGroup.shutdownGracefully()
workerGroup.shutdownGracefully()
}
}
public static void main(String[] args) throws Exception {
new NettyServer().start(666)
}
}
package Netty;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class NettyServerHandler extends ChannelInboundHandlerAdapter{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("Netty server 激活...");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("Netty server 接收消息:"+ msg);
ctx.write("hello too");
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
package Netty
import io.netty.bootstrap.Bootstrap
import io.netty.channel.ChannelFuture
import io.netty.channel.ChannelInitializer
import io.netty.channel.ChannelOption
import io.netty.channel.ChannelPipeline
import io.netty.channel.EventLoopGroup
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.string.StringDecoder
import io.netty.handler.codec.string.StringEncoder
public class NettyClient {
public void run(String host,int port) {
EventLoopGroup group = new NioEventLoopGroup()
try {
Bootstrap b = new Bootstrap()
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline()
p.addLast("decoder", new StringDecoder())
p.addLast("encoder", new StringEncoder())
p.addLast(new NettyClientHandler())
}
})
ChannelFuture future = null
try {
future = b.connect(host, port).sync()
} catch (InterruptedException e) {
e.printStackTrace()
}
try {
future.channel().closeFuture().sync()
} catch (InterruptedException e) {
e.printStackTrace()
}
} finally {
group.shutdownGracefully()
}
}
public static void main(String[] args) throws Exception {
new NettyClient().run("127.0.0.1",666)
}
}
package Netty;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class NettyClientHandler extends ChannelInboundHandlerAdapter{
@Override
public void channelActive(ChannelHandlerContext ctx) {
System.out.println("netty client 启动...");
ctx.channel().writeAndFlush("hello lin");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println("netty 服务器响应信息:"+msg);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}