Java_SpringBoot+WebSocket长连接_独乐乐不如众乐乐_南国

WebSocket详解(Java后端,基于Springboot) WebSocket是一种在单个TCP连接上进行全双工通信的协议。这种协议在2011年被IETF定为标准RFC 6455,并由RFC7936补充规范,同时WebSocket API也被W3C定为标准。它使得客户端和服务器之间的数据交换变得更加简单,特别是允许服务端主动向客户端推送数据。实时性更高:WebSocket技术可以实现实时通信,传输数据的延迟更低,因此可以更快地将数据传输到客户端。减少网络带宽的使用:通过建立一个持久化的连接,WebSocket减少了HTTP协议中每次请求和响应所需要的网络带宽。 阅读详情

Java使用WebSocket

网页端的消息推送,一般有以下几种方式

轮询方式:

客户端定时向服务端发送ajax请求,服务器接收到请求后马上返回消息并关闭连接。
优点:后端程序编写比较容易。
缺点:TCP的建立和关闭操作浪费时间和带宽,请求中有大半是无用,浪费带宽和服务器资源。

实例:适于小型应用。

长轮询:

客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。

长连接:

在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销,当客户端越来越多的时候,server压力大!
实例:Gmail聊天

Flash Socket:

在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件,移动端支持不好,IOS系统中没有flash的存在;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。

webSocket:

HTML5 WebSocket设计出来的目的就是取代轮询和长连接,使客户端浏览器具备像C/S框架下桌面系统的即时通讯能力,实现了浏览器和服务器全双工通信,建立在TCP之上,虽然WebSocket和HTTP一样通过TCP来传输数据,但WebSocket可以主动的向对方发送或接收数据,就像Socket一样;并且WebSocket需要类似TCP的客户端和服务端通过握手连接,连接成功后才能互相通信。
优点:双向通信、事件驱动、异步、使用ws或wss协议的客户端能够真正实现意义上的推送功能。
缺点:少部分浏览器不支持。
示例:社交聊天(微信、QQ)、弹幕、多玩家玩游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等高实时性的场景。

综合来看,各有优缺点,不过WebSocket长连接更实用,微信,QQ,聊天室等

既然要使用Socket,就要弄懂两个东西,什么是Socket?为什么要用Socket?

什么是WebSocket?

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

为什么要用Socket?

在这里插入图片描述初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起,HTTP 协议做不到服务器主动向客户端推送信息。
举例来说,我们想要查询当前的排队情况,只能是页面轮询向服务器发出请求,服务器返回查询结果。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此WebSocket 就是这样发明的。

-------------------这是一道华丽的分割线---------------------------

从网上看了很多文章感觉,很多Demo运行不了,然后就找了很多,综合了很多
无论是Tomcat版本,还是Spring拦截器版本,配置都好多,不好集成,对比之后还是SpringBoot比较好用

废话不多说,直接上代码,跟着我做,肯定可以运行起来的

第一步:引包,加入maven依赖

<dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-websocket</artifactId>  
</dependency> 

第二步:启用WebSocket

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * 开启WebSocket支持
 * @author zhangzhiwei
 */
@Configuration  
public class WebSocketConfig {  
	
    @Bean  
    public ServerEndpointExporter serverEndpointExporter() {  
        return new ServerEndpointExporter();  
    }  
  
} 

第三部:编码WebSocket服务端

package com.hnyfkj.argotechnique.web.controller;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
/**
 * WebSocket服务
 * @author zhangzhiwei
 */
@ServerEndpoint("/websocket/{userId}")
@Component
public class WebsocketControler {

	static Log log = LogFactory.get(WebsocketControler.class);
	private static int onlineCount = 0;
	// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
	private static ConcurrentHashMap<String, WebsocketControler> clients = new ConcurrentHashMap<>();
	private Session session;
	private String userId;

	/**
	 * 连接建立成功调用的方法
	 *
	 * @param session
	 *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
	 * @throws IOException
	 */
	@OnOpen
	public void onOpen(@PathParam("userId") String userId, Session session) throws IOException {
		this.session = session;
		this.userId = userId;
		if (clients.containsKey(userId)) {
			clients.remove(userId);
			clients.put(userId, this);
			// 加入set中
		} else {
			clients.put(userId, this);
			// 加入set中
			addOnlineCount();
			// 在线数加1
		}

		log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount());

		try {
			sendMessage("连接成功");
		} catch (IOException e) {
			log.info("用户:" + userId + ",网络异常!!!!!!");
		}
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose(@PathParam("userId") String userId, Session session) {
		if (clients.containsKey(userId)) {
			clients.remove(userId);
			// 从set中删除
			subOnlineCount();
		}
		log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用的方法
	 *
	 * @param message
	 *            客户端发送过来的消息
	 * @param session
	 *            可选的参数
	 * @throws IOException
	 */
	@OnMessage
	public void onMessage(String message, Session session) throws IOException {
		log.info("用户消息:" + userId + ",报文:" + message);
		// 可以群发消息
		// 消息保存到数据库、redis
		if (StringUtils.isEmpty(message)) {
			try {
				// 解析发送的报文
				JSONObject jsonObject = JSON.parseObject(message);
				// 追加发送人(防止串改)
				jsonObject.put("fromUserId", this.userId);
				String toUserId = jsonObject.getString("toUserId");
				// 传送给对应toUserId用户的websocket
				if (StringUtils.isEmpty(toUserId) && clients.containsKey(toUserId)) {
					clients.get(toUserId).sendMessage(jsonObject.toJSONString());
				} else {
					log.error("请求的userId:" + toUserId + "不在该服务器上");
					// 否则不在这个服务器上,发送到mysql或者redis
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 实现服务器主动推送
	 */
	public void sendMessage(String message) throws IOException {
		this.session.getBasicRemote().sendText(message);
	}

	/**
	 * 发生错误时调用
	 *
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		log.error("用户错误:" + this.userId + ",原因:" + error.getMessage());
		error.printStackTrace();
	}

	/**
	 * 发送自定义消息
	 */
	public static void sendInfo(String message, @PathParam("userId") String userId) throws IOException {
		log.info("发送消息到:" + userId + ",报文:" + message);
		if (!StringUtils.isEmpty(userId) && clients.containsKey(userId)) {
			clients.get(userId).sendMessage(message);
		} else {
			log.error("用户" + userId + ",不在线!");
		}
	}

	public static synchronized int getOnlineCount() {
		return onlineCount;
	}

	public static synchronized void addOnlineCount() {
		WebsocketControler.onlineCount++;
	}

	public static synchronized void subOnlineCount() {
		WebsocketControler.onlineCount--;
	}

	public static synchronized Map<String, WebsocketControler> getClients() {
		return clients;
	}
}

第四步:消息推送接口编写

@RestController
@RequestMapping("/")
@Api(tags = { "平台接口" })
public class MarketInterface {

	@Reference(version = "${dubbo.consumer.MemberinfoService.version}")
	private MemberinfoService memberinfoService;

	private static Map<String, List<String>> clients = new HashMap<String, List<String>>();

	@PostMapping("/pushMessage")
	@ApiOperation(value = "推送消息", produces = "application/json")
	public RespDto<String> pushMessage(final String userId, final String message) throws IOException {
		// 向指定用户集合中添加消息
		List<String> list = clients.get(userId);
		if (StringUtils.isEmpty(list)) {
			list = new ArrayList<>();
		}
		list.add(message);
		clients.put(userId, list);
		// 向指定用户发送消息
		for (String message1 : list) {
			WebsocketControler.sendInfo(message1, userId);
		}
		return RespDto.succ();
	}

	@PostMapping("/removeMessage")
	@ApiOperation(value = "消费消息", produces = "application/json")
	public RespDto<String> removeMessage(final String userId) throws IOException {
		// 删除消息
		clients.remove(userId);
		return RespDto.succ("消费消息成功");
	}

这里是根据我业务需求写的,你们只需要调用第一个方法就可以了,我这里需要前台告诉我收到消息了,我才可以消费消息,防止发了前台没收到这种情况,所以写了两个接口,一个发送消息,一个消费消息

第五步:Html页面,这种页面网上到处都是,随便占一个

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket示例</title>
    <meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport' />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <input id="text" type="text"/>
    <button onclick="send()">发送消息</button>
    <hr/>
    <button onclick="closeWebSocket()">关闭WebSocket连接</button>
    <hr/>
    <div id="message"></div>
</body>

<script type="text/javascript">
    var websocket = null;
    //判断当前浏览器是否支持WebSocket
    if ('WebSocket' in window) {
        // 不带参数的写法
        websocket = new WebSocket("ws://127.0.0.1:8093/hnyfkj-argotechnique/websocket/2");
       
    }
    else {
        alert('当前浏览器 Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function () {
        setMessageInnerHTML("WebSocket连接发生错误");
    };

    //连接成功建立的回调方法
    websocket.onopen = function () {
        setMessageInnerHTML("WebSocket连接成功");
    }

    //接收到消息的回调方法
    websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function () {
        setMessageInnerHTML("WebSocket连接关闭");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function () {
        closeWebSocket();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //关闭WebSocket连接
    function closeWebSocket() {
        websocket.close();
    }

    //发送消息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</html>

这里的那个userId是用来建立管道的,根据userId的不同,进行不同用户的信息推送,这里我写死了,用一个数字2,实际开发要拿到变量来进行后台交互

第六步:看效果,改BUG

1.运行Java代码,打开Html,出现下面红框即表示成功
在这里插入图片描述这里后台跟前台建立了连接

2.PostMan模仿发送请求
在这里插入图片描述调用接口,向前台推送消息,你好啊,前台

调用后台接口之后,后台会打印报文,以及在线连接数

3.后台控制台出现这样的打印即代表成功
在这里插入图片描述成功之后,前台就会收到这样子的消息啦,聊天室一般都是这样子做的,是不是感觉很简单,哈哈哈哈

在这里插入图片描述

websocket实现通讯——Java 阅读详情

相关推荐

【Java使用WebSocket步骤】

【Java使用WebSocket步骤】

学无止境 4302

springboot websocket 设置长连接时间

在@ServerEndpoint类中的 @OnOpen public void onOpen(Session session)方法 中 session.setMaxIdleTimeout(3600000);

siqsiqsiq3的博客 1万+

手把手教你用Qwen-7B打造医疗大模型:从数据准备到RLHF全流程实战

本文是一篇基于Qwen-7B-Chat模型构建医疗领域大模型的实战全流程指南。文章详细拆解了从数据准备、环境搭建,到增量预训练、监督微调(SFT)以及偏好对齐(DPO)的核心技术步骤,并分享了部署与持续优化的实践经验。通过LoRA等高效微调技术,帮助开发者掌握将通用大模型改造为专业领域专家的完整方法论。

weixin_29191761的博客 129

springboot下spring方式实现Websocket并设置session时间

springboot下spring方式实现Websocket并设置session时间

奔跑的菜鸡 3368

局域网ip冲突检测工具_python 小工具实现 windows笔记本与 ipad数据互传

宅在家没事的时候就开始琢磨ipad的进阶使用,由于没有mac无法隔空投送,ipad与windows的数据交互表现极差,所以设计了这个ftp小工具。当然,这个工具不仅仅能用于windows与ipad,还可以用于局域网任意两台设备之间程序源码与下载见文章末尾使用说明windows端:biubiubiu.exeipad端: appsotre下载 FE文件管理器windows端操作在c盘下创建ftp目录...

weixin_39866265的博客 4435

Oracle 常用语法汇总

CREATE TABLE 表名(COMMENT ON COLUMN 注释;-- 创建一个学生表STUDENT_ID NUMBER(10) PRIMARY KEY, -- 学生ID,主键FIRST_NAME VARCHAR2(50) NOT NULL, -- 学生名字,不允许为空LAST_NAME VARCHAR2(50) NOT NULL, -- 学生姓氏,不允许为空EMAIL VARCHAR2(100) UNIQUE, -- 学生电子邮箱,唯一。

拽着尾巴的鱼儿的博客 2154

websocket 前+后端协调demo

websocket 前+后端协调

weixin_45812090的博客 2848

企业微信-审批控件中的外部选项的应用全流程完美解决方案

完美解决企业微信所有JS-SDK调用问题 完美解决苹果和PC端不适配的问题

qq_45195039的博客 5859

WebSocket 长连接

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层早期,很多网站为了实现推送技术,所用的技术都是轮询(也叫短轮询)。轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端。常见的轮询方式分为轮询与长轮询在这种情况下,HTML5 定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

sekever的博客 4075

华为OD机试 - 荒岛求生 - 栈Stack(Python/JS/C/C++ 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 2837

瑞芯微RK3588平台YOLOv8Pose模型RKNN部署与C++优化实战:从模型转换到高效推理的全流程指南-附源码

错误码 | 原因 | 解决方案 || -1001 | ONNX算子不支持 | 升级RKNN SDK至最新版 || -2003 | 量化校准数据不足 | 增加校准图片至500张 || -3005 | 输入尺寸不匹配 | 固定模型输入尺寸为640x640 || 资源消耗 | CPU 35% | NPU 90% |

m0_64661770的博客 988

微信小程序与java实现websocket长连接

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它通过在握手阶段将HTTP升级协议为WebSocket协议来实现。在握手成功后,客户端和服务器端可以互相推送消息,而不需要不断的发起HTTP请求和响应。WebSocket长连接通常用于需要实时推送数据或实时聊天的场景。Java通过Java和微信小程序的结合实现WebSocket长连接,我们可以方便地在应用中实现实时推送和在线聊天等功能,使应用更符合用户的使用习惯,也提高了用户对应用的使用体验。

油焖茄子 的博客 2554

ESP32与BH1750光照传感器结合使用的Web服务器案例

请注意,为了使代码正常工作,你需要将代码中的"你的WiFi网络名称"和"你的WiFi网络密码"替换为你自己的WiFi网络凭据。在代码中,我们首先导入了所需的库文件,包括Wire库用于I2C通信,BH1750库用于与光照传感器通信,WiFi库和WebServer库用于创建Web服务器。接下来,我们将编写一个Arduino代码来控制ESP32与BH1750的通信,并将读取到的光照强度值显示在Web服务器上。函数用于处理根路径的请求,其中我们读取光照传感器的值,并将其显示在返回的HTML页面中。

server_api196的博客 617

保持websocket长时间连接永不断开

保持websocket长时间连接,永不断开

weixin_44014982的博客 9683

Python量化交易:主流回测框架Backtrader入门详解

Python量化交易框架Backtrader入门指南 Backtrader是一个功能强大的Python量化回测框架,可以帮助交易者专注于策略逻辑而非基础设施。本文介绍了Backtrader的核心架构和使用方法: 框架优势:自动处理订单执行、手续费、滑点、仓位管理等复杂问题,采用事件驱动模式接近真实交易场景。 核心组件: Cerebro:控制中心 Strategy:交易策略 Data Feed:数据输入 Broker:模拟经纪商 Indicators:技术指标 使用流程: 安装:pip install bac

Science prince的博客 935

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

websocket前后端长连接之java部分

第三个是管理器,其中的add方法,本身是有一个判重机制,如果该连接已存在就把原来的踢下线,重新连接新的,防止出现多个同样的id的问题.但是这又导致了新的频繁关闭重连的问题,所以后来改成了如果已经存在就直接return。第二个,拦截器,这里我区分了pc和app,因为代码需求是同一个id登录的用户要在pc端和app端同时连接websocket,为做区分,在pc的userid后面加了pc两个字母.最后附上在线连接websocket测试的网站:http://www.websocket-test.com/

m0_50707445的博客 2003

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java socket的超时设置

1、socket连接建立超时 socket连接建立是基于TCP的连接建立过程。TCP的连接需要通过3次握手报文来完成,开始建立TCP连接时需要发送同步SYN报文,然后等待确认报文SYN+ACK,最后再发送确认报文ACK。TCP连接的关闭通过4次挥手来完成,主动关闭TCP连接的一方发送FIN报文,等待对方的确认报文;被动关闭的一方也发送FIN报文,然等待确认报文。 正在等待TCP连接请求的一端有

yutel的专栏 7743

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java基础之《netty(21)—WebSocket长连接开发》

一、实例要求1、http协议是无状态的,浏览器和服务器间的请求响应一次,下一次会重新创建连接 2、要求:实现基于webSocket的长连接的全双工的交互 3、改变http协议多次请求的约束,实现长连接了,服务器可以发送消息给浏览器 4、客户端浏览器和服务器端会相互感知,比如服务器关闭了,浏览器会感知,同样浏览器关闭了,服务器会感知二、服务端1、WebSocketServer.java 2、MyTextWebSocketFrameHandler.java 三、客户端1、hello.html 四、测

csj50的专栏 2411

Vue+WebSocket 实现页面实时刷新长连接

Vue+WebSocket 实现页面实时刷新长连接 知乎链接 最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死。。。 与后台人员讨论过后决定使用h5新增的WebSocket来实现数据实时展示 一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支...

weixin_43550660的博客 9043

springboot实现webocket长连接(一)

springboot实现webocket长连接,这里通过一种较简单的方式实现websocket。这里简单的意思是指前端可以通过浏览器原生对象websocket实现客户端,如果浏览器不支持的话,这个方式不适用了,需要改造一下。推荐demo:多种websocket实现方式,其中有基于spring-websocekt,也有基于netty框架,即下即用。

iaoyou1的博客 1507

java 实现长连接webSocket

java websocket 实现连接

qq_45282968的博客 3618

【netty】java如何作为websocket客户端 对服务端发起请求

为什么会使用java作为websocket客户端?虽说websocket协议 本意是web与服务端之间的通讯协议,那假设有一天 我们的供应商 或者是甲方大爷 只提供了websocket接口呢?如果直接让前端去对接,再把数据传给后端,那从前端对接到后端入库的步骤,万一出现数据丢失呢?总之把数据处理放在后端,是相对可靠的长链接有两点值得注意的,一是心跳机制 二是重连机制如果不发送心跳包,可能过会儿连接就断开了;重新机制就比较好理解了,不管是服务端还是客户端的断开,作为客户端都需要能够重连。

孟秋与你的博客 6244

Java网络Socket编程-websocket

仍未收到消息或心跳,则认为连接已关闭,更新监控 WebSocket 的状态为 "CLOSE"。实现一个用于监测 WebSocket 连接状态的线程类,其作用是通过创建一个 WebSocket 客户端,连接到指定的 WebSocket 地址,并监测连接的状态。方法,可以创建一个 WebSocket 客户端,并连接到指定的 WebSocket 地址。方法,可以关闭 WebSocket 连接,并更新监控 WebSocket 的状态为 "CLOSE"。注解的方法,来处理与 WebSocket 连接相关的事件。

我惠依旧的博客 4206

6、Spring Session-WebSocket集成

Spring Session提供了和Spring Websocket透明集成的支持。Spring Session的Websocket支持仅适用于Spring的Websocket支持,具体来说他不能直接支持JSR-356。这是由于JSR-356没有拦截进入Websocket消息的机制。

Ron.Zheng 4419

SpringBoot+WebSocket技术实现

WebSocket 1.背景 为了实现推送技术,实时更新前端页面。 2.实现方式 1.Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器 2.浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。 3.优势 Ajax:这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有

黑小飞的博客 765

让计算机等待的函数_面试汇总(三):计算机网络常见面试总结(一)

前言上一篇文章我们介绍了在面试中数据库常见的面试题。今天我们给大家介绍在面试中,计算机网络常见的面试题。计算机网络在计算机行业中是一门最基础的技术,无论是在开发项目还是在算法岗,项目的应用最终还是落实在用户的使用,网络的连接是至关重要的,因此,这就要求我们需要对计算机网络有一定的了解。接下来,这篇文章给大家介绍在面试中常见的计算机网络的知识点。当然,开发和算法岗对计算机网络的要求程度不同,相对而言...

weixin_39902107的博客 813
上一篇: Python使用cx_Oracle报错Ora-01036解决方案_南国
下一篇: SpringBoot+EasyPoi三步完成Excel导入导出_南国
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值