基于前几篇文章,我们对于学习Netty源码已经做好了相应的基础知识储备,今天我们会使用Netty实现一个简单的Server端功能
1. 目标
-
基于Netty实现Server端,并成功启动Server端,监听端口,并打印接收到的消息
-
利用telnet连接1中启动成功的Server端,并发送消息
2. 准备工作
IntelliJ IDEA + Maven + Netty 4.1.36.Final版本
- 首先通过IDEA新建一个Maven项目,并引入所要依赖Netty的版本
这里选择目前最新的版本
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.36.Final</version>
</dependency>
- 新建目录结构如下
其中handler包用于编写所有Server端所需的Handler,Server类则作为整个Server的启动类
3. 编码
- handler包下新建ServerInboundHandler类
该类继承Netty提供的入站处理器ChannelInboundHandlerAdapter
public class ServerInboundHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 1.
ByteBuf in = (ByteBuf) msg;
StringBuilder sMsg = new StringBuilder();
while (in.isReadable()) {
sMsg.append((char) in.readByte());
}
System.out.println(sMsg.toString());
super.channelRead(ctx, msg);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
super.channelReadComplete(ctx);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause);
}
}
- 编写Server类
public class Server {
// 监听端口
private int port;
private Server(int port) {
this.port = port;
}
// 启动一个Server服务器
private void start() throws InterruptedException {
// 1.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// 2.
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
// 3.
.channel(NioServerSocketChannel.class)
// 4.
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new ServerInboundHandler());
}
})
// 5.
.option(ChannelOption.SO_BACKLOG, 128)
// 6.
.childOption(ChannelOption.SO_KEEPALIVE, true);
System.out.println("Server is started");
// 7.
ChannelFuture f = serverBootstrap.bind(port).sync();
// 8.
f.channel().closeFuture().sync();
}finally {
// 9.
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws InterruptedException {
// 利用vm参数传递端口号,不传则默认8081
int port;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
}else{
port = 8081;
}
// 启动server
System.out.println("Server to starting... the port is: " + port);
new Server(port).start();
}
}
4. 启动Server
执行Server类的main函数
02.png可以看到Server端已经启动完成,并开始监听8081端口,等待Client的连接
5. telnet 连接Server
利用Windows自带的telnet模拟Client连接Server端,并发送消息给Server
-
windows下
Win + R键
输入cmd
-
输入
telnet localhost 8081
-
Ctrl + ]
进入telnet 命令模式,目的是可以使用telnet的命令模式一次发送多个字符
- 命令模式下键入
send Hello Server
,回车 ,server端控制台即打印出Hello Server 消息
总结
本文基于Netty实现了基本的Server服务端功能,监听8081端口,接受来自Client的连接,并打印Client端发送的消息
下一篇文章会以解读源码的方式分析Server端是如何启动以及telnet模拟Client端发送Hello Server 消息后,Server是如何接收并打印出来的
网友评论