Netty学习一 HelloWorld
1、netty服务端开发套路
> 1、创建线程组,指定负责连接客户端的通道 > 2、初始化通道,该类继承ChannelInitializer类,并指定各种Handler > 3、添加自定义Handler,需要继承ChannelInboundHandlerAdapter2、maven依赖
```3、服务端
入口
public class HelloWorldServer {
private int port;
public HelloWorldServer(int port) {
this.port = port;
}
public void start(){
EventLoopGroup bossGroup = new NioEventLoopGroup();//创建父子线程组
EventLoopGroup workGroup = new NioEventLoopGroup();
ServerBootstrap server = new ServerBootstrap();
server.group(bossGroup, workGroup)
.channel(NioServerSocketChannel.class)//指定处理客户端的通道
.childHandler(new ServerChannelInitializer());//通道初始化
try {
ChannelFuture future = server.bind(port).sync();
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
public static void main(String[] args) {
HelloWorldServer server = new HelloWorldServer(8888);
server.start();
}
}
通道初始化
public class ServerChannelInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast("decoder", new StringDecoder());// 字符串解码和编码
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", new HelloWordServerHandler());//自定义handler
}
}
自定义处理器
public class HelloWordServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("服务端收到消息:[" + msg + "]");
ctx.writeAndFlush("欢迎你,客户端");
}
}
4、客户端
### 入口 ``` public class HelloWorldClient {private int port;
private String address;
public HelloWorldClient(int port, String address) {
this.port = port;
this.address = address;
}
public void start() {
EventLoopGroup group = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group).channel(NioSocketChannel.class)
.handler(new ClientChannelInitializer());
try {
ChannelFuture future = bootstrap.connect(address,port).sync();
Channel channel = future.channel();
channel.writeAndFlush("我是客户端,地址:" + channel.remoteAddress());
channel.closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
}
public static void main(String[] args) {
HelloWorldClient client = new HelloWorldClient(8888, "127.0.0.1");
client.start();
}
}
### 通道初始化
public class ClientChannelInitializer extends ChannelInitializer
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast("decoder", new StringDecoder());//字符串解码和编码
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", new HelloWorldClientHandler());//自定义handler
}
}
### 自定义处理器
public class HelloWorldClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("客户端收到消息:[" + msg + "]");
}
}
<h1>5、运行</h1>
先启动服务端,再启动客户端,可以看到,服务端和客户端分别收到了对方发送的消息
### 服务端收到消息
![](https://img2018.cnblogs.com/blog/1373276/201906/1373276-20190603163957020-260958172.png)
### 客户端收到消息
![](https://img2018.cnblogs.com/blog/1373276/201906/1373276-20190603164006441-471814764.png)