赞
踩
加入依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.39.Final</version>
</dependency>
服务器端代码
package com.example.nettytest.netty.day1;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.logging.LoggingHandler;
/**
* @description:
* @author: xz
*/
public class Server {
public static void main(String[] args) {
//1、服务端启动器:负责组装netty组件
new ServerBootstrap()
//2、添加 EventLoop(事件循环)
.group(new NioEventLoopGroup())
//3、选择服务器的 ServerSocketChannel 实现
.channel(NioServerSocketChannel.class)
//4、添加服务端处理器
// boss负责处理连接;worker(也就是netty中的child) 负责处理读写,决定了 worker(也就是netty中的child) 能执行哪些操作(handler)
.childHandler(
// 5. channel 代表和客户端进行数据读写的通道 Initializer 初始化,负责添加别的 handler
new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
//6、添加具体 handler
nioSocketChannel.pipeline().addLast(new LoggingHandler());
nioSocketChannel.pipeline().addLast(new StringDecoder());//将 ByteBuf 转换为字符串
nioSocketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter(){//自定义handler
//处理读事件
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 打印上一步转换好的字符串
System.out.println("msg==========="+msg);
}
});
}
})
//7、绑定监听端口
.bind(8080);
}
}
代码1位置 :服务端启动器:负责组装netty组件
代码2位置 :创建 NioEventLoopGroup,可以简单理解为 线程池 + Selector 后面会详细展开;
代码3位置:选择服务 Scoket 实现类,其中 NioServerSocketChannel 表示基于 NIO 的服务器端实现,其它实现还有
代码4位置:为啥方法叫 childHandler,是接下来添加的处理器都是给 SocketChannel 用的,而不是给 ServerSocketChannel。ChannelInitializer 处理器(仅执行一次),它的作用是待客户端 SocketChannel 建立连接后,执行 initChannel 以便添加更多的处理器;
代码5位置:channel代表和客户端进行数据读写的通道 Initializer 初始化,负责添加别的 handler;
代码6位置:添加具体 handler;
代码7位置: ServerSocketChannel 绑定的监听端口;
package com.example.nettytest.netty.day1;
import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import java.net.InetSocketAddress;
/**
* @description:
* @author: xz
*/
public class Client {
public static void main(String[] args) throws InterruptedException {
// 1. 客户端启动器
new Bootstrap()
// 2. 添加 EventLoop(事件循环)
.group(new NioEventLoopGroup())
// 3. 选择客户端的 SocketChannel 实现
.channel(NioSocketChannel.class)
// 4. 添加客户端处理器
.handler(new ChannelInitializer<NioSocketChannel>() {
// 在连接建立后被调用
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
//9. 消息会经过通道 handler 处理,这里是将 String => ByteBuf 发出
nioSocketChannel.pipeline().addLast(new StringEncoder());
}
})
.connect(new InetSocketAddress("localhost",8080))//5. 连接到服务器
.sync()//6. 等待 connect 建立连接完毕
.channel()//7. 连接对象
.writeAndFlush("hello world !");//8. 发送数据
}
}
流程梳理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。