第一章,IDEA中Netty框架的导入和简单使用
1.IDEA导入Netty
Idea中导入netty有两种方式
一、在网上下载好Netty的jar包
https://netty.io/downloads.html
在项目目录下创建lib目录,然后将netty的jar包放入其中。
这里我们需要的jar包路径在压缩包的all-in-one文件夹中。
在IDEA左侧目录下右键jar包,选择AddAsLibrary,即可将其导入项目。
二、 使用Maven
进入项目设置(ctrl + shift + alt + S),选择Library,点击左上角的加号,选择From Maven,
在弹出的搜索框中输入netty-all,选择想要下载的版本后,勾选下面的DownLoad左边的勾,点击ok,即可导入成功。
2.启动Netty
先写一个小demo,试试将netty启动
Main.java
public class Main {
private static final String IP = "127.0.0.1"; // 写死IP
private static final int PORT = 8088; // 写死绑定的端口
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(); // boss对象,用于监听socket连接
EventLoopGroup workerGroup = new NioEventLoopGroup(); // worker对象,用于数据读写与处理逻辑
ServerBootstrap bootstrap = new ServerBootstrap(); // 引导类,引导服务器的启动
bootstrap
.group(bossGroup, workerGroup) // 双线程绑定
.channel(NioServerSocketChannel.class) // 指定IO模型为NIO
.childHandler(new ChannelInitializer<SocketChannel>() { // 在这里面进行数据读写,业务处理逻辑
@Override
protected void initChannel(SocketChannel ch) throws Exception {
System.out.println("客户端连接:" + ch.remoteAddress()); // 打印客户端地址端口
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast(new SocketServerHandler());
}
})
.bind(IP, PORT).sync();
System.out.println("服务器启动!");
}
}
- 其中,bootstrap是一个netty服务器启动引导类,首先绑定两个对象,boss和worker分别处理客户端连接与数据读写逻辑处理。
- 接着调用channel(NioServerSocketChannel.class)设置IO模型为NIO。
- 其次调用childHandler,设置一个用于引导channel初始化的类,重写initChannel,每当有新的客户端连接进来时,就会调用这里对channel进行初始化。
在initChannel方法中,pipline对象相当于一个流水线,在这里对pipline进行设置,也就意味着每当客户端传来新消息,都会顺着流水线对数据有序地进行处理,在这里我设置了string的解码和编码,经过打包后可以把客户端传来的数据还原成string类型。
- 最下面加入了一个SocketServerHandler消息处理类,用于做具体的逻辑业务处理。
SocketServerHandler.java
public class SocketServerHandler extends SimpleChannelInboundHandler<String> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
System.out.println(s);
}
}
其中,SocketServerHandler是一个数据处理器,在里面实现的逻辑决定了连接创建以后和收到信息后该如何处理。
SocketServerHandler继承于SimpleChannelInboundHandler类,这里简单重写实现了channelRead0方法,对接收到的数据s进行输出。
码完后我们直接运行代码,可以得到如下结果:
3.运行测试
下面为了测试,我们简单撸一个测试用的客户端
Client.java
public class Client {
public static void main(String[] args) {
try {
InetAddress addr;
Socket socket = new Socket("127.0.0.1", 8088);
addr = socket.getInetAddress();
System.out.println("连接到" + addr);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String lineString = "连接测试";
writer.write(lineString);
writer.flush();
socket.close();
} catch (IOException e) {
System.out.println("无法连接");
System.out.println(e);
}
}
}
这里撸的是一个简单的BIO程序,创建socket,连接到对应地址的对应端口,将测试数据发送到服务端,然后关闭socket。
直接运行,可以看到客户端控制台输出:
服务端控制台输出:
这里我们已经实现了由客户端向服务端发送信息。下一章我们学习如何用服务端向客户端发送信息。
https://blog.csdn.net/sinat_18538231/article/details/101565251