Netty实现简单Server(Java)

0、前言

《Idea多模块项目(netty)》中,搭建基本程序框架。

1、先上代码目录

Netty实现简单Server(Java)

2、pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>com.ct.netty.http</artifactId>
    <version>1.0.0.0</version>
    <packaging>jar</packaging>

    <parent>
        <artifactId>com.ct.netty</artifactId>
        <groupId>com.ct</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
        </dependency>
    </dependencies>

</project>

3、Server启动类

绑定了8088端口。

package com.ct.netty.http.Ijava;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
/**
 *
 * @Author LaoHa
 * @Date 2021/6/6
 */
public class HelloServer {
    public static void main(String[] args) {
        //定义主线程组,用于接收客户端请求,但是并不做任何逻辑处理
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        //从线程组,主线程组会把相应的请求转交给该线程组,由从线程组去做任务
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        //创建netty服务器
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        try {
            //服务器设置绑定两个线程组,并设置相应的助手类【handler】
            serverBootstrap.group(bossGroup, workerGroup)
                    //设置nio双向通道
                    .channel(NioServerSocketChannel.class)
                    //子处理器
                    .childHandler(new HelloServerInitializer());

            //启动server并绑定端口号
            ChannelFuture channelFuture = serverBootstrap.bind(8088).sync();
            //关闭监听的channel
            channelFuture.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

4、初始化配置器

package com.ct.netty.http.Ijava;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;

/**
 * 初始化配置器,channel注册成功后,会执行里面相应的初始化方法
 *
 * @Author LaoHa
 * @Date 2021/6/6
 */
public class HelloServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        //channel获取相应的管道
        ChannelPipeline pipeline = channel.pipeline();
        //为管道增加相应的handler,可理解为是拦截器,或者监听器,监听客户端建立连接后的信息
        //当请求到服务端,我们需要对写出到客户端的数据做编码处理
        pipeline.addLast("httpCode", new HttpServerCodec());
        //添加自定义助手类,可添加多个
        pipeline.addLast("HelloHandler", new HelloHandler());
    }
}

5、自定义助手句柄处理类

package com.ct.netty.http.Ijava;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;

/**
 * 自定义助手类
 *
 * @Author LaoHa
 * @Date 2021/6/6
 */
public class HelloHandler extends SimpleChannelInboundHandler<HttpObject> {
    @Override
    protected void messageReceived(ChannelHandlerContext context, HttpObject msg)
            throws Exception {
        //通过context的上下文获取channel
        Channel channel = context.channel();
        if (msg instanceof HttpRequest) {
            //获取请求地址
            System.out.println("请求地址:" + channel.remoteAddress());
        }
        //自定义相应客户端信息
        ByteBuf content = Unpooled.copiedBuffer("Hello Netty <<<>>>", CharsetUtil.UTF_8);
        //侯建httpResponse对象
        FullHttpResponse response = new DefaultFullHttpResponse(
                HttpVersion.HTTP_1_1,
                HttpResponseStatus.OK,
                content);
        //设置response对象的头信息
        response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");
        response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
        //将数据刷到客户端
        context.writeAndFlush(response);
    }
}

6、运行测试

运行HelloServer,启动一下服务端,然后浏览器输入,http://localhost:8088/
Netty实现简单Server(Java)

附录

Netty入门教程——认识Netty

看这一篇入门《Netty入门教程——认识Netty

上一篇:Netty 线程模型


下一篇:Netty优雅退出