java基础之Netty(主要用来开发像微信,qq等聊天软件)

news2024/11/15 11:31:34

一、Netty的定义

Netty是一个基于Java NIO的网络编程框架,提供了一套高效的、事件驱动的异步网络通信机制。简化了网络应用程序的开发过程,提供了可靠的、高性能的网络传输

二、Netty的特点是什么

  1. 异步和事件驱动:Netty使用异步的、非阻塞的I/O模型,通过事件驱动的方式处理网络操作。Netty能够高效地处理并发连接和大量的并发请求。
  2. 高性能:Netty采用了一系列优化策略,如零拷贝技术、内存池和可定制的线程模型等,以提供出色的性能和吞吐量。能处理高负载和大规模并发
  3. 多协议支持:Netty提供了丰富的协议支持,包括常用的网络协议(如HTTP、WebSocket、TCP和UDP)以及自定义协议。具备灵活的编解码器和处理器,简化了协议的实现和交互。
  4. 可扩展和灵活:Netty的架构和组件设计具有高度的可扩展性和灵活性。它提供了一组可重用的组件,可以根据应用需求进行定制和扩展。
  5. 安全性:Netty提供了强大的安全性支持,包括SSL/TLS的集成、加密和认证等机制,可以保护网络通信的安全性。
  6. 易于使用和学习:提供了清晰简洁的API和文档,易于使用和学习。它还具有丰富的示例和教程,帮助开发人员快速上手和构建可靠的网络应用。

三、Netty的架构图

四、这里我们主要讲client端,server端,和channel端

客户端代码

EventLoopGroup group = new NioEventLoopGroup();

Bootstrap b = new Bootstrap();

b.group(group).channel(NioSocketChannel.class);

b.handler(new ChannelInitializer<Channel>() {

@Override

protected void initChannel(Channel ch) throws Exception {

ChannelPipeline pipeline = ch.pipeline();

pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));

pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));

pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));

pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));

pipeline.addLast("handler", new TcpClientHandler());

}

});

b.option(ChannelOption.SO_KEEPALIVE, true);

// 发送消息

Channel channel = b.connect(host, port).sync().channel();

channel.writeAndFlush(msg).sync();

服务器端代码

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workerGroup);

// TCP channel

b.channel(NioServerSocketChannel.class);

b.childHandler(new ChannelInitializer<SocketChannel>() {

@Override

public void initChannel(SocketChannel ch) throws Exception {

ChannelPipeline pipeline = ch.pipeline();

pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));

pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));

pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));

pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));

pipeline.addLast(new TcpServerHandler());

}

});

b.bind(IP, PORT).sync();

LOG.info("TCP服务器已启动");

缓存channel通道SimpleChannelInboundHandler

@Override

protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {

LOG.info("接收到消息:" + msg);

// 接收到消息后再次发送消息

ctx.channel().writeAndFlush("已经收到消息:" + msg);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

【C++】命名空间namespace

为什么要有namespace&#xff1f; namespace是用来解决命名冲突&#xff08;名字污染&#xff09;的问题的。看看下面的代码&#xff1a; #include <cstdlib>int rand 10;int main() {return 0; }可以看到&#xff0c;这段代码什么都没干&#xff0c;就定义了一个全局…

[leetcode] 64. 最小路径和

文章目录 题目描述解题方法动态规划java代码复杂度分析 相似题目 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#…

【字符串】Leetcode 43. 字符串相乘

题目讲解 43. 字符串相乘 算法讲解 class Solution { public:void AddZero(string& temp, int cnt) {while (cnt--) {temp 0;} }string Add(string num1, string num2) {string result;int carry 0;int i num1.size() - 1;int j num2.size() - 1;while (i > 0 ||…

制作微信在线答题步骤是什么

在信息爆炸的时代&#xff0c;学习不再只是书本和课堂的代名词。随着移动互联网的飞速发展&#xff0c;微信作为人们日常生活中不可或缺的沟通工具&#xff0c;也为我们提供了全新的学习平台。今天&#xff0c;就让我们一起探讨如何制作微信在线答题&#xff0c;让学习变得更加…

五种主流数据库:窗口函数

SQL 窗口函数为在线分析系统&#xff08;OLAP&#xff09;和商业智能&#xff08;BI&#xff09;提供了复杂分析和报表统计的功能&#xff0c;例如产品的累计销量统计、分类排名、同比/环比分析等。这些功能通常很难通过聚合函数和分组操作来实现。 本文比较了五种主流数据库实…

如何使用摇摆交易?fpmarkets实例讲解

各位投资者五一节后快乐&#xff01;祝愿投资者在接下来的日子里每次交易都以盈利结算。 五一节日也是劳动节&#xff0c;在这个特殊的日子里fpmarkets澳福和各位勤劳的投资者一起学习如何使用摇摆交易策略进行交易&#xff1f; 其实很简单&#xff0c;首先判断出买卖点&#x…

淡茶怎么泡?

很多人都知道喝浓茶对身体不好&#xff0c;但是怎么冲泡淡茶却一知半解。按照《品深淡茶冲泡标准》中对绿茶冲泡淡茶的规定&#xff0c;冲泡的茶汤中咖啡碱不得高于31.67mg/100mL&#xff0c;可可碱不得高于2.67mg/mL&#xff0c;茶碱不得高于1.50mg/100mL&#xff0c;茶多酚不…

无经验计科应届生前端面试遇到的问题整理

js数据类型有几种&#xff0c;分别是 原始数据类型&#xff08;Primitive data types&#xff09;: 字符串&#xff08;String&#xff09;: 用于表示文本数据&#xff0c;使用单引号&#xff08;‘’&#xff09;或双引号&#xff08;“”&#xff09;括起来。 数字&#xff…

高精地图是怎么构建的?方案有哪些?高精度语义地图构建的一点思考

高精地图是怎么构建的&#xff1f;方案有哪些&#xff1f;高精度语义地图构建的一点思考 高精度(High-Definition, HD)语义地图是目前自动驾驶领域的一个重要研究方向&#xff0c;近年随着Transformer和BEV的大火&#xff0c;很多大佬团队都开展了HD语义地图构建相关的工作。2…

企业邮箱是什么样子的?怎么弄一个企业邮箱

企业邮箱是什么样子的&#xff1f;企业使用的电子邮箱有特征&#xff1f;其实&#xff0c;企业邮箱的主要特征就在于电子邮箱域名的个性化&#xff0c;以及可扩展性的功能&#xff0c;在使用企业邮箱时能够提升公司的品牌形象。今天小编和大家仔细来聊聊。 一、企业邮箱是什么…

初识指针(2)<C语言>

前言 前文介绍完了一些指针基本概念&#xff0c;下面介绍一下&#xff0c;const关键字、指针的运算、野指针的成因以及避免&#xff0c;assert函数等。 目录 const&#xff08;常属性&#xff09; 变量的常属性 指针的常属性 指针的运算 ①指针 -整数 ②指针-指针 ③指针与…

智慧工地)智慧工地标准化方案(107页)

2.2 设计思路 对于某某智慧工地管理系统的建设&#xff0c;绝不是对各个子系统进行简单堆砌&#xff0c;而是在满足各子系统功能的基础上&#xff0c;寻求内部各子系统之间、与外部其它智能化系统之间的完美结合。系统主要依托于智慧工地管理平台&#xff0c;来实现对众多子系统…

武汉星起航:助力客户在亚马逊平台顺利入驻,实现跨境电商新飞跃

在全球化浪潮的推动下&#xff0c;跨境电商行业迎来了前所未有的发展机遇。作为全球电商巨头&#xff0c;亚马逊以其独特的平台属性和消费群体较高的消费能力&#xff0c;吸引了众多中国卖家的目光。武汉星起航电子商务有限公司凭借其专业的运营团队和丰富的行业经验&#xff0…

软件测试与管理-白盒测试-逻辑覆盖法例题

目录 知识点&#xff1a; 例题 &#xff1a; 知识点&#xff1a; 语句覆盖&#xff1a;设计足够多的测试用例&#xff0c;使得被测试程序中的“ 每条可执行语句至少被执行一次” 优点&#xff1a;可通过源码观察直观地得到测试用例&#xff0c;无须细分每个判定表达式。缺点&am…

韧性增长与库存挑战并存,白酒行业上演“冰与火之歌”?

随着近日五粮液成绩单的公布&#xff0c;白酒板块主要上市公司的业绩均已出炉。 整体来看&#xff0c;虽然2023年白酒行业仍处于深度结构性调整&#xff0c;但相关上市公司业绩似乎并未受过多影响&#xff0c;均表现出喜人的增长态势&#xff0c;这也带动了白酒股的上行。据悉…

轻松上手的LangChain学习说明书

一、Langchain是什么&#xff1f; 如今各类AI模型层出不穷&#xff0c;百花齐放&#xff0c;大佬们开发的速度永远遥遥领先于学习者的学习速度。。为了解放生产力&#xff0c;不让应用层开发人员受限于各语言模型的生产部署中…LangChain横空出世界。 Langchain可以说是现阶段…

MySQL数据库—DQL查询语句(一篇教会你快速找到想要的数据)

目录 ▐ 特定列查询 ▐ 逻辑处理 ▐ 字符函数操作 ▐ 分组函数统计 ▐ 数学函数 ▐ 日期函数 ▐ 条件查询 ▐ 排序 ▐ 数量限制 ▐ 合并 ▐ 分组查询 ▐ 前言&#xff1a; • DQL全称 Data Query Language 数据查询语言 • 可以从一个表中查询数据&#xff0c;也…

数据库大作业——基于qt开发的图书管理系统(二) 相关表结构的设计

前言 在上一篇文章中。我们完成了Qt环境的安装&#xff0c;同时完成了有关项目需求的分析并绘制了整体的项目架构图&#xff0c;而在图书管理系统中&#xff0c;其实我们主要完成的就是对数据的增删改查&#xff0c;并将这些功能通过信号与槽机制和可视化界面绑定在一起&#…

Fluent 区域交界面的热边界条件

多个实体域公共交界面的壁面&#xff0c;Fluent 会分拆为 wall 和 wall-shadow 的两个壁面&#xff0c;两者为配对关系&#xff0c;分别从属于一个实体域。 配对面可使用热通量、温度、耦合三类热边界条件&#xff0c;前两者统称为非耦合热边界条件。 耦合为配对面默认的热边界…