WebSocket和Servlet3.0服务器消息推送技术

2023-12-23 01:08

本文主要是介绍WebSocket和Servlet3.0服务器消息推送技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近研究了两种服务器消息推送技术,一种是WebSocket技术,一种是基于Servlet3.0实现的服务器异步消息推送技术,具体实现如下:

1. WebSocket(聊天室)

WebSocket客户端连接类(javaee-api-7.0.jar)
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;/*** @ServerEndpoint 功能主要是将CharRoomServer 定义为websocket服务器端*/
@ServerEndpoint("/ws/charRoomServer")
public class CharRoomServer {// 会话,主要用于向客户端发送数据private Session session;public Session getSession() {return session;}/*** websocket连接* @param session*/@OnOpenpublic void onOpen(Session session){this.session = session;SessionManager.add(this);     }/*** websocket断开*/@OnClosepublic void onClose(){SessionManage.remove(this);}/*** websocket消息* @param message* @param session*/@OnMessagepublic void onMessage(String message, Session session) {Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String messageFormat = "{\"date\":\"%s\",\"name\":\"%s\",\"content\":\"%s\"}";String msg = String.format(messageFormat, sdf.format(date),"客户端" + session.getId(), message);// 广播SessionManage.broadCast(msg);}/*** websocket错误* @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error){error.printStackTrace();}/*** 广播消息方法* @param message* @throws IOException*/public void sendMessage(String message) throws IOException{this.session.getBasicRemote().sendText(message);}}
SessionManage类
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;public class SessionManage {private static Collection<CharRoomServer> charRoomServers = Collections.synchronizedCollection(new ArrayList<CharRoomServer>());/*** 广播* @param msg*/public static void broadCast(String msg){for (CharRoomServer charRoomServer : charRoomServers) {try {charRoomServer.sendMessage(msg);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** 新增客户端服务器* @param charRoomServer*/public static void add(CharRoomServer charRoomServer){// 使用时间构造登录信息Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String messageFormat = "{\"date\":\"%s\",\"name\":\"系统\",\"content\":\"%s\"}";String content = "欢迎客户端" + charRoomServer.getSession().getId();String message = String.format(messageFormat, sdf.format(date), content);// 广播broadCast(message);// 加入服务组charRoomServers.add(charRoomServer);}/*** 客户端服务器退出* @param charRoomServer*/public static void remove(CharRoomServer charRoomServer){// 客户端服务器退出charRoomServers.remove(charRoomServer);// 使用时间构造退出信息Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String messageFormat = "{\"date\":\"%s\",\"name\":\"系统\",\"content\":\"%s\"}";String name = "客户端" + charRoomServer.getSession().getId();String message = String.format(messageFormat, sdf.format(date), name + "已退出");// 广播broadCast(message);}}

2. Servlet3.0(SpringBoot:DeferredResult)

Application 入口类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableAsync
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
AsyncController异步控制器
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;/*** 异步控制器*/
@RequestMapping("/async")
@RestController
public class AsyncController {private DeferredResult<String> deferredResult;@RequestMapping("/getDeferredResult")public DeferredResult<String> getDeferredResult() {deferredResult = new DeferredResult<String>();return deferredResult;}/*** 每2秒执行一次*/@Scheduled(fixedDelay = 2000)public void refreshDeferredResult() {if (deferredResult != null) {String result = "getDeferredResult:" + System.currentTimeMillis();deferredResult.setResult(result);}}@RequestMapping("/getResult")public String getResult() {return "getResult";}
}
前端页面关键js代码
function getDeferredResult() {$.ajax({url:"/async/getDeferredResult",type:"post",success:function(data){$("table").html(data);getDeferredResult();}});
}
getDeferredResult();
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><groupId>com.example.async</groupId><artifactId>async</artifactId><version>0.0.1-SNAPSHOT</version><!-- 编码和版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

这篇关于WebSocket和Servlet3.0服务器消息推送技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/526177

相关文章

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

Prometheus+cpolar如何在手机上也能监控服务器状态?

《Prometheus+cpolar如何在手机上也能监控服务器状态?》本文强调了通过Cpolar这一内网穿透工具,轻松突破Prometheus仅限于局域网访问的限制,实现外网随时随地访问监控数据,教你... 目录前言1.安装prometheus2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

python协程实现高并发的技术详解

《python协程实现高并发的技术详解》协程是实现高并发的一种非常高效的方式,特别适合处理大量I/O操作的场景,本文我们将简单介绍python协程实现高并发的相关方法,需要的小伙伴可以了解下... 目录核心概念与简单示例高并发实践:网络请求协程如何实现高并发:核心技术协作式多任务与事件循环非阻塞I/O与连接

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn