Netty开发

Netty开发

一、pom引入

		<dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.42.Final</version>
        </dependency>

二、Netty服务器

1、服务端
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class NettyClient {

    public static void main(String[] args) {

        //客户端只需要一个事件循环组
        EventLoopGroup eventLoopGroup = null;

        try {

            eventLoopGroup = new NioEventLoopGroup();

            //创建客户端启动对象
            Bootstrap bootstrap = new Bootstrap();

            //客户端启动对象配置
            //设置线程组
            bootstrap.group(eventLoopGroup)
                    //设置客户端通道的实现类
                    .channel(NioSocketChannel.class)
                    //给事件循环组设置对应的通道处理器
                    .handler(new ChannelInitializer<SocketChannel>() {

                        @Override
                        protected void initChannel(SocketChannel socketChannel){

                            //字符串解码器
                            socketChannel.pipeline().addLast("docode", new StringDecoder());
                            //字符串编码器
                            socketChannel.pipeline().addLast("encode", new StringEncoder());
                            //信息读取处理器
                            socketChannel.pipeline().addLast(new ClientInputMessageHandler());
                        }


                    });

            System.out.println("客户端启动...");

            //启动客户端去连接服务器端
            ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6666).sync();

            //关闭通道进行监听
            channelFuture.channel().closeFuture().sync();


        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            eventLoopGroup.shutdownGracefully();

        }


    }

}

2、服务端信息处理器

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import java.nio.channels.Channel;
import java.nio.charset.StandardCharsets;

public class ServerInputMessageHandler extends SimpleChannelInboundHandler<String> {

    /**
     * 当通道就绪 触发该方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {

    }


    /**
     * 当通道有读取事件时  触发该方法
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) {
        System.out.println(" 客户端发送的消息:" + msg);
    }




    /**
     * 数据读取完毕 触发该方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.writeAndFlush("hello 客户端,我已接收到你发过来的信息...");
    }

    /**
     * 发生异常  触发该方法
     *
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
    }




}

三、客户端

1、客户端

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class NettyClient {

    public static void main(String[] args) {

        //客户端只需要一个事件循环组
        EventLoopGroup eventLoopGroup = null;

        try {

            eventLoopGroup = new NioEventLoopGroup();

            //创建客户端启动对象
            Bootstrap bootstrap = new Bootstrap();

            //客户端启动对象配置
            //设置线程组
            bootstrap.group(eventLoopGroup)
                    //设置客户端通道的实现类
                    .channel(NioSocketChannel.class)
                    //给事件循环组设置对应的通道处理器
                    .handler(new ChannelInitializer<SocketChannel>() {

                        @Override
                        protected void initChannel(SocketChannel socketChannel){

                            //字符串解码器
                            socketChannel.pipeline().addLast("docode", new StringDecoder());
                            //字符串编码器
                            socketChannel.pipeline().addLast("encode", new StringEncoder());
                            //信息读取处理器
                            socketChannel.pipeline().addLast(new ClientInputMessageHandler());
                        }


                    });

            System.out.println("客户端启动...");

            //启动客户端去连接服务器端
            ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6666).sync();

            //关闭通道进行监听
            channelFuture.channel().closeFuture().sync();


        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            eventLoopGroup.shutdownGracefully();

        }


    }

}

2、客户端信息处理器

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

public class ClientInputMessageHandler extends SimpleChannelInboundHandler<String> {

    /**
     * 当通道就绪 触发该方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        ctx.writeAndFlush("hello 服务端...");
    }


    /**
     * 当通道有读取事件时  触发该方法
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println("服务端发送的消息:" + msg);
    }


    /**
     * 发生异常  触发该方法
     *
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
    }



}

四、运行截图

1、服务端

在这里插入图片描述

2、客户端

在这里插入图片描述

### 回答1: 我可以给你一些关于Netty开发Web项目的建议:1. 使用Netty的高级API来实现高效的Web服务;2. 将Netty用于实现RESTful API;3. 利用Netty的异步特性来提升Web应用的性能;4. 使用Netty的线程模型来实现高可用的Web应用。 ### 回答2: Netty是一个高性能的网络编程框架,可以用于开发各种网络应用,包括web项目。在用Netty开发一个web项目时,我们可以使用Netty提供的HttpServerCodec来处理Http请求和响应。 首先,我们需要创建一个Netty服务器,并配置监听的端口号。然后,设置PipelineFactory,用来创建ChannelPipeline(通道流水线),并在其中添加HttpServerCodec处理器。HttpServerCodec负责将Http请求和响应进行编解码,同时处理Http的keep-alive和chunked传输。接下来,我们需要自定义一个处理器,用来处理具体的Http请求和生成响应。 在自定义处理器中,我们可以根据Http请求的URI来路由到不同的业务逻辑处理器,比如处理获取用户信息、提交表单等等。业务逻辑处理器可以根据具体的需求,与数据库、其他服务进行交互,处理业务逻辑,并生成相应的Http响应。在处理完成后,我们可以将响应结果发送给客户端。 最后,我们需要在服务器中绑定监听端口,启动服务器,等待客户端请求的到来。当有新的Http请求到达时,Netty会将请求交给我们自定义的处理器进行处理,并生成响应返回给客户端。 总之,使用Netty开发一个web项目需要配置服务器、设置通道流水线、自定义请求处理器,并根据具体需求进行业务逻辑的处理和响应的生成。使用Netty的优势在于其高性能和可扩展性,可以处理大量的并发请求,同时提供良好的网络编程抽象和易于使用的API。 ### 回答3: Netty 是一个高性能的 Java 网络编程框架,可以用于开发各种网络应用,包括 web 项目。下面以一个简单的 web 项目开发为例,说明如何使用 Netty 开发。 1. 创建一个空的 Maven 项目,添加 Netty 依赖。 2. 创建一个 Server 类,负责启动服务器,并设置服务器的端口号。 3. 在 Server 类中,创建一个服务器的启动引导类,通过该引导类配置服务器的一些参数和处理器。 4. 创建一个 HTTP 请求处理器类,继承 ChannelInboundHandlerAdapter,并覆写其中的方法,用于接收和处理 HTTP 请求。 5. 在请求处理器类中,使用 HttpRequestDecoder 解析接收到的请求,获取请求路径和参数等信息。 6. 根据请求路径进行判断和处理,可以编写相应的业务逻辑处理代码。 7. 使用 HttpResponseEncoder 将处理结果封装成响应,通过 ChannelHandlerContext 返回给客户端。 8. 在 Server 类的 main 方法中,创建一个 EventLoopGroup,并使用 ServerBootstrap 绑定服务器端口号,并启动服务器。 通过以上步骤,就可以使用 Netty开发一个简单的 web 项目了。当有客户端发起请求时,服务器会接收到请求并进行处理,然后将处理结果返回给客户端。 Netty 的优势在于其高性能和灵活的架构,可以处理大量并发连接,适用于开发高并发、高吞吐量的 web 项目。此外,Netty 还提供了一些辅助类和工具,方便开发者进行网络编程。 当然,这只是一个简单的示例,实际开发中还需要考虑更多的问题,比如线程模型、连接管理、安全性等。但通过以上步骤,可以帮助你入门使用 Netty 开发 web 项目。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大树下躲雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值