锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 搭建简单的Netty开发环境

搭建简单的Netty开发环境

0
  • 软件开发
  • 发布于 2024-07-29
  • 15 次阅读
黄健 黄健 Administrator Administrator

原文链接:https://blog.csdn.net/qq_33227649/article/details/78317912

今天准备学学声明显赫的Netty框架,自然要先学会怎么搭建一个简单的Netty开发环境啦。话不多说,下面进入正文。

编辑器方面自然是推荐IntelJ idea了,idea的强大不必多说,百度一下你就知道。哈哈

下面就是准备Netty的jar包了,如果你会maven的话自然是使用maven最为方便了。只需要在pom文件中导入以下几行

<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->

    <dependency>

      <groupId>io.netty</groupId>

      <artifactId>netty-all</artifactId>

      <version>4.1.16.Final</version>

    </dependency>

当然啦,不会maven的也不用愁,可以在官网直接下载jar包,点击跳转。并在编辑器中将下载的jar包引入你的lib中,就可以愉快的开始Netty开发了

下面贴一个简单的netty案例

一、 服务端代码

1. EchoServerHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFutureListener;

import io.netty.channel.ChannelHandler.Sharable;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

import io.netty.util.CharsetUtil;

 

@Sharable

public class EchoServerHandler extends ChannelInboundHandlerAdapter{

    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //将客户端传入的消息转换为Netty的ByteBuf类型

        ByteBuf in = (ByteBuf) msg;

 

        // 在控制台打印传入的消息

        System.out.println(

                "Server received: " + in.toString(CharsetUtil.UTF_8)

        );

        //将接收到的消息写给发送者,而不冲刷出站消息

        ctx.write(in);

    }

 

    @Override

    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        // 将未处决消息冲刷到远程节点, 并且关闭该Channel

        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)

                .addListener(ChannelFutureListener.CLOSE);

    }

 

    /**

     * 异常处理

     * @param ctx

     * @param cause

     * @throws Exception

     */

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        //打印异常栈跟踪

        cause.printStackTrace();

 

        // 关闭该Channel

        ctx.close();

    }

}

2. EchoServer.java

import io.netty.bootstrap.ServerBootstrap;

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.NioServerSocketChannel;

 

import java.net.InetSocketAddress;

 

public class EchoServer {

    private final static int port = 8080;

 

    public static void main(String[] args) {

        start();

    }

 

    private static void start() {

        final EchoServerHandler serverHandler = new EchoServerHandler();

        // 创建EventLoopGroup

        EventLoopGroup bossGroup = new NioEventLoopGroup();

        EventLoopGroup workerGroup = new NioEventLoopGroup();

        // 创建EventLoopGroup

        ServerBootstrap b = new ServerBootstrap();

        b.group(bossGroup, workerGroup)

                //指定所使用的NIO传输Channel

        .channel(NioServerSocketChannel.class)

                //使用指定的端口设置套接字地址

        .localAddress(new InetSocketAddress(port))

                // 添加一个EchoServerHandler到Channle的ChannelPipeline

        .childHandler(new ChannelInitializer<SocketChannel>() {

            @Override

            protected void initChannel(SocketChannel socketChannel) throws Exception {

                //EchoServerHandler被标注为@shareable,所以我们可以总是使用同样的案例

                socketChannel.pipeline().addLast(serverHandler);

            }

        });

 

        try {

            // 异步地绑定服务器;调用sync方法阻塞等待直到绑定完成

            ChannelFuture f = b.bind().sync();

            // 获取Channel的CloseFuture,并且阻塞当前线程直到它完成

            f.channel().closeFuture().sync();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            // 优雅的关闭EventLoopGroup,释放所有的资源

            bossGroup.shutdownGracefully();

            workerGroup.shutdownGracefully();

        }

    }

}

二、 客户端代码

1. EchoClientHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandler.Sharable;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.SimpleChannelInboundHandler;

import io.netty.util.CharsetUtil;

 

@Sharable

public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        //当被通知Channel是活跃的时候,发送一条消息

        ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));

    }

 

    @Override

    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {

        System.out.println(

                "Client received: " + byteBuf.toString(CharsetUtil.UTF_8)

        );

    }

 

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        cause.printStackTrace();

        ctx.close();

    }

}

2. EchoClient.java

import io.netty.bootstrap.Bootstrap;

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 java.net.InetSocketAddress;

 

public class EchoClient {

    private final static String HOST = "localhost";

    private final static int PORT = 8080;

 

    public static void start() {

        EventLoopGroup group = new NioEventLoopGroup();

        Bootstrap bootstrap = new Bootstrap();

        bootstrap.group(group)

                .channel(NioSocketChannel.class)

                .remoteAddress(new InetSocketAddress(HOST, PORT))

                .handler(new ChannelInitializer<SocketChannel>() {

                    @Override

                    protected void initChannel(SocketChannel socketChannel) throws Exception {

                        socketChannel.pipeline().addLast(new EchoClientHandler());

                    }

                });

        try {

            ChannelFuture f = bootstrap.connect().sync();

            f.channel().closeFuture().sync();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }finally {

            group.shutdownGracefully();

        }

    }

 

    public static void main(String[] args) {

        start();

    }

}

先后运行EchoServer.java和EchoClient.java.如果控制台分别打印了

Server received: Netty rocks!

和

Client received: Netty rocks!

标签: #软件开发 1171 #JAVA 991 #新手必读 21
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.