netty+websocket+quartz实现消息定时推送&&IM聊天室

在讲功能实现之前,我们先来捋一下底层的原理,后面附上工程结构及代码

1.NIO

NIO主要包含三大核心部分:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。

下图是NIO通信的结构图。

NIO之所以是NIO,背后有Selector

Selector可以实现:一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这从根本上解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。

1.1缓冲区(Buffer)

一个用于特定基本数据类 型的容器。由 java.nio 包定义的,所有缓冲区 都是 Buffer 抽象类的子类.。Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中。

缓冲区的基本属性

这部分内容较为枯燥,运用netty框架后直接调API,可以暂时跳过

Buffer 中的重要概念:

容量 (capacity) :作为一个内存块,Buffer具有一定的固定大小,也称为"容量",缓冲区容量不能为负,并且创建后不能更改。

限制 (limit):表示缓冲区中可以操作数据的大小(limit 后数据不能进行读写)。缓冲区的限制不能为负,并且不能大于其容量。 写入模式,限制等于buffer的容量。读取模式下,limit等于写入的数据量。

位置 (position):下一个要读取或写入的数据的索引。缓冲区的位置不能为 负,并且不能大于其限制

标记 (mark)与重置 (reset):标记是一个索引,通过 Buffer 中的 mark() 方法 指定 Buffer 中一个特定的 position,之后可以通过调用 reset() 方法恢复到这 个 position.

标记、位置、限制、容量遵守以下不变式:0

Buffer常见方法

使用Buffer读写数据一般遵循以下四个步骤:

1.写入数据到Buffer

2.调用flip()方法,转换为读取模式

3.从Buffer中读取数据

4.调用buffer.clear()方法或者buffer.compact()方法清除缓冲区

1.2通道(Channel)

通道Channe概述

1、 NIO 的通道类似于流,但有些区别如下:

通道可以同时进行读写,而流只能读或者只能写

通道可以实现异步读写数据

通道可以从缓冲读数据,也可以写数据到缓冲:

2、BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中的通道(Channel)

是双向的,可以读操作,也可以写操作。

3、Channel 在 NIO 中是一个接口

FileChannel的常用方法

1.3选择器(Selector)

选择器(Selector)概述

选择器(Selector) 是 SelectableChannle 对象的多路复用器,Selector 可以同时监控多个 SelectableChannel 的 IO 状况,也就是说,利用 Selector可使一个单独的线程管理多个 Channel。Selector 是非阻塞 IO 的核心。

NIO精华(必看)

Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,就会使用到 Selector(选择器)

Selector 能够检测多个注册的通道上是否有事件发生(注意:多个 Channel 以事件的方式可以注册到同一个Selector),如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管多个通道,也就是管理多个连接和请求。

只有在 连接/通道 真正有读写事件发生时,才会进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程

避免了多线程之间的上下文切换导致的开销

2.Netty

看完上面的NIO基本概述,那么你已经对NIO的通信框架有一定的了解了,下面介绍一下Netty。

Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。摘自百度百科

参考blog:Netty入门教程——认识Netty

3.websocket

websocket实现服务器中消息极速推送到前端。

很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。摘自百度百科

4.quartz

Quartz介绍及入门案例

上面这个是之前用SSM框架实现的quartz定时任务demo,大家感兴趣可以了解一下,本次在SpringBoot项目中用了轻量级的定时框架SpringTask。

1、开启@EnableScheduling注解

2、@Scheduled定义定时任务

5.项目工程

5.1工程框架及基础配置信息

pom.xml

application.yml

启动类

5.2controller

5.3service

5.4serviceImpl

5.5nettywebsocket

NettyConfig

NettyServer

WebSocketHandler

5.6scheduler定时器

5.7前端

PostMan测试

------------END-----------

netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送相关推荐

  1. php实现微信小程序推送,实现微信小程序模板消息不受限制、无限主动推送

    需求背景 基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发 ...

  2. 织梦火车头采集文章定时自动审核文章及更新文章后自动推送百度(站群排名必备)

    织梦火车头采集文章定时自动审核文章及更新文章后自动推送百度(站群排名必备) 1.从0点到23点可以设置若干时间段,在这些时间段内,每天自动审核和自动生成指定篇数的未审核文章. 2.自动更新网站首页和需 ...

  3. websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...

    问题背景 为什么要要用websocket呢?websocket相对于传统http协议有什么优势呢? http协议有一个缺陷,就是通信只能由客户端发起,服务器返回数据,不能做到服务器主动向客户端推送.这 ...

  4. 程序员的浪漫:晨起给女友定时发送天气预报,睡前给女友定时讲故事

    情侣之间除了平日一起探究有趣的事情,总是少不了就是 "日常早晚请安" 1.请安情景一 男: 今日阳光明媚,多云转晴,小懒猪快起床啦 女:早起啦,话说你是不是还在被窝里呢 男:嘿嘿 ...

  5. worker服务器推送消息,关于Worker如何向指定Client推送消息

    use Workerman\Worker; require_once './Workerman/Autoloader.php'; // 初始化一个worker容器,监听1234端口 $worker = ...

  6. Websocket实现Java后台主动推送消息到前台

    写在前面 需求: 项目测试, 缺少用户登录失败给admin推送消息, 想到这个方式, 当用户登录失败时, admin用户会在页面看到咣咣乱弹的alert. 正文 pom.xml <!-- web ...

  7. php订阅号发送消息,php实现微信公众号主动推送消息

    通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下 此方法是通过模拟登录微信公共平台的方法来实现的. 代码如下: 一.登录接口部分代码 / ...

  8. Android中脱离WebView使用WebSocket实现群聊和推送功能

    WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...

  9. WebSocket | 为什么你前后端推送不会用?因为你少了WebSocket的帮忙

    Hi! 我是小小,今天是本周的第三篇,本篇将会着重的讲解关于WebSocket的相关知识,本篇开始讲解. 什么是WebSocket WebSocket是一种基于TCP的网络协议,实现了客户端和服务端的 ...

最新文章

  1. 利用CSS设置页面的垂直居中效果
  2. Java程序员必备:序列化全方位解析
  3. c#类和结构体的关系
  4. PostgreSQL参数学习:vacuum_defer_clean_age
  5. dede织梦调用顶级二级栏目及下三级栏目方法!
  6. struts2验证码
  7. mysql死锁检测算法_MySQL InnoDB如何应付死锁
  8. mybatis配置log4j控制台打印SQL语句
  9. @ApiOperation
  10. MATLAB绘制开环单位阶跃响应,MATLAB语言与控制系统仿真-参考 答案-第5章.doc
  11. 睿智的目标检测30——Pytorch搭建YoloV4目标检测平台
  12. 计算机高水平竞赛,国际类高水平的竞赛有哪些?
  13. vue+ElementUI 实现管理端照片墙(或广告位)效果
  14. Stack Overflow是如何做应用缓存的
  15. oracle 12c 安装scott,Oracle 12c中添加scott用户的方法
  16. 专访阿里云闵万里:云上逐鹿,ET大脑要做行业化、垂直化的创新运用
  17. weka中使用liblinear
  18. Python基础题之千焦千卡转换
  19. Java高级教程3_图形用户界面GUI
  20. veni vidi vici密钥我的生日ACIGS解密_25人在同一天生日!男女比例又是多少?阳光新生大数据来了!...

热门文章

  1. 一些关于Rust在2019年的思考
  2. 小坑记录:get_cmap参数区分大小写
  3. unix环境高级编程-线程(2)
  4. Guava库学习:学习Collections(二)Lists
  5. Haproxy+keepalived高可用代理服务
  6. 乔布斯留给后人最宝贵的十条经验!
  7. Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用
  8. C++ string类的方法
  9. 透过现象看本质-使用vs.net第二天
  10. golang 获取切片 slice 第一个 最后一个 元素