spring websocket 教程,spring websocket 实现聊天室功能

Spring WebSocket实现实时通信的详细教程 WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。WebSocket 连接允许客户端和服务器之间的全双工通信,以便任何一方都可以通过已建立的连接将数据推送到另一方。我们常用的HTTP是客户端通过「请求-响应」的方式与服务器建立通信的,必须是客户端主动触发的行为,服务端只是做好接口被动等待请求。而在某些场景下的动作,是需要服务端主动触发的,比如向客户端发送消息、实时通讯、远程控制等。 阅读详情

1.背景

了解计算机网络协议的人,应该都知道:HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。

这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。

2.websocket事件

openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发

3.websocket方法

Socket.send()

使用连接发送数据

Socket.close()

关闭连接

4.websocket属性

Socket.readyState

只读属性 readyState 表示连接状态,可以是以下值:

  • 0 - 表示连接尚未建立。

  • 1 - 表示连接已建立,可以进行通信。

  • 2 - 表示连接正在进行关闭。

  • 3 - 表示连接已经关闭或者连接不能打开。

Socket.bufferedAmount

只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

 5.实例

前端代码

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<link href="${pageContext.request.contextPath }/resources/css/demo.css"
	rel="stylesheet" type="text/css">
</head>
<body>
<h4>欢迎您:<span>${SESSION_USERNAME }</span></h4>
	<div id="box">
		<div id="title">
			<p id="receiver" style="background: #cacaca;text-align: center;">websocket聊天室</p>
		</div>
		<div id="firends">
		<P id="xxp">在线好友</P>
			<ul>
				
			</ul>
		</div>
		<div id="divxx"></div>
	</div>
	<div>
		<textarea id="context"></textarea>
	</div>
	<button id="dianji">发送</button>
</body>
</html>
<script type="text/javascript"
	src="${pageContext.request.contextPath }/resources/js/jquery-3.0.0.js"></script>
<script type="text/javascript"
	src="${pageContext.request.contextPath }/resources/js/demo.js"></script>
<script type="text/javascript">
var websocket = null;
var target = {}; // 封装发送数据的json
if('WebSocket' in window) {
	websocket = new WebSocket("ws://localhost:8080${pageContext.request.contextPath}/websocket");
} else if('MozWebSocket' in window) {
	websocket = new MozWebSocket("ws://localhost:8080${pageContext.request.contextPath}/websocket");
}

websocket.onopen = onOpen;
websocket.onmessage = onMessage;
websocket.onerror = onError;
websocket.onclose = onClose;

function onOpen(openEvt) {}

function onMessage(evt) {
	var val = $("#context").val();
	var msg = JSON.parse(evt.data);
	if(msg.type=="firendList"){
		var fir =msg.data;
		$("ul").empty();
		for(var i=0;i<fir.length;i++){
			if(fir[i]!='${SESSION_USERNAME }'){
				$("ul").append(
					"<li>"+fir[i]+"</li>"	
				);
			}
		}
	}else if(msg.type=="message"){
		if(msg.sender=='${SESSION_USERNAME }'){
			$("#divxx").append(
				"<div class='clearFolat'>" +
				"<div id='msg' style='folat:right;'>" +
				"<p id='nickname' style='text-align: right;' >${SESSION_USERNAME }</p>" +
				"<p id='message' style='text-align: right;'>" +
				val +
				"</p>" +
				"</div>" +
				"<div style='folat:right;' id='log'><img src='${pageContext.request.contextPath }/resources/img/lol.jpg' width='50px' height='50px' /></div>" +
				"</div>"
			);
		}else{
			$("#divxx").append(
				"<div class='clearFolat'>" +
				"<div id='log'><img src='${pageContext.request.contextPath }/resources/img/lol.jpg' width='50px' height='50px' /></div>" +
				"<div id='msg' >" +
				"<p id='nickname'>"+msg.sender+"</p>" +
				"<p id='message'>" +
				msg.data +
				"</p>" +
				"</div>" +
				"</div>"
			);
		}
	}
	document.getElementById("context").value = "";
	duiqi();
}

function onError() {}
function onClose() {}

function doSend() {
	if(websocket.readyState == websocket.OPEN) {
		var msg = document.getElementById("context").value;
		target.data = msg;
		target.sender = '${SESSION_USERNAME }';
		console.log(target)
		websocket.send(JSON.stringify(target)); // 调用后台handleTextMessage方法
		console.log(JSON.stringify(target))
	} else {
		alert("连接失败!");
	}
}

$("#dianji").click(function() {
	doSend();
	flag = false;
	duiqi()
})
//保证新消息可以看到,消息列表底部对齐
function duiqi(){
	var div = document.getElementById('box');
	div.scrollTop = div.scrollHeight;
}

window.onclose=function(){
	onClose();
}

</script>

后端实现步骤

1.创建websocket配置类,实现WebSocketConfigurer接口

@Configuration
@EnableWebSocket
public class MyWebsocketconfig implements WebSocketConfigurer {
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		registry.addHandler(webSocketHandler(), "/websocket")
				.addInterceptors(new SpringWebSocketHandlerInterceptor());
	}

	@Bean
	public TextWebSocketHandler webSocketHandler() {
		return new SpringWebSocketHandler();
	}
}

2.创建websocket拦截器,处理自己的业务,可以不实现

public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
	@Override
	public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
			Map<String, Object> attributes) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Before Handshake");
		if (request instanceof ServletServerHttpRequest) {
			ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
			 HttpServletRequest httpServletRequest = ((ServletServerHttpRequest) request).getServletRequest();
			HttpSession session = httpServletRequest.getSession(false);
			if (session != null) {
				// 使用userName区分WebSocketHandler,以便定向发送消息
				String userName = (String) session.getAttribute("SESSION_USERNAME");
				attributes.put("WEBSOCKET_USERNAME", userName);
			}
		}
		return super.beforeHandshake(request, response, wsHandler, attributes);
	}

	@Override
	public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
			Exception ex) {
		// TODO Auto-generated method stub
		super.afterHandshake(request, response, wsHandler, ex);
	}
}

3.创建websocket处理类,处理前端各种请求,实现业务

public class SpringWebSocketHandler extends TextWebSocketHandler {
	private static final Map<String, WebSocketSession> userMap;
	static {
		userMap = new HashMap<String, WebSocketSession>();
	}

	public SpringWebSocketHandler() {
	}

	/**
	 * 连接成功时候,会触发页面上onopen方法
	 */
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		// TODO Auto-generated method stub
		// 这块会实现自己业务
		userMap.put(getUsername(session), session);
		Result result = new Result();
		result.setType("firendList");
		result.setData(userMap.keySet());
		sendMessageToUsers(new TextMessage(JSONArray.toJSONString(result)));
	}

	/**
	 * 关闭连接时触发
	 */
	public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
		String username = (String) session.getAttributes().get("WEBSOCKET_USERNAME");
		System.out.println("用户" + username + "已退出!");
		userMap.remove(getUsername(session));
		System.out.println("剩余在线用户" + userMap.keySet().size());
		Result result = new Result();
		result.setType("firendList");
		result.setData(userMap.keySet());
		sendMessageToUsers(new TextMessage(JSONArray.toJSONString(result)));
	}

	/**
	 * js调用websocket.send时候,会调用该方法
	 */
	protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
		System.out.println("收到的消息--" + message.getPayload());
		JSONObject json = JSONObject.parseObject(message.getPayload());
		Result result = new Result();
		result.setData(json.getString("data"));
		result.setType("message");
		result.setSender(json.getString("sender"));
		sendMessageToUsers(new TextMessage(JSONArray.toJSONString(result)));
	}

	public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
		if (session.isOpen()) {
			session.close();
		}
		userMap.remove(getUsername(session));
	}

	public boolean supportsPartialMessages() {
		return false;
	}

	/**
	 * 给某个用户发送消息
	 *
	 * @param userName
	 * @param message
	 */
	public void sendMessageToUser(String userName, TextMessage message) {
		Set<String> set = userMap.keySet();
		for (String username : set) {
			if (username.equals(userName)) {
				WebSocketSession session = userMap.get(username);
				if (session.isOpen()) {
					try {
						session.sendMessage(message);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				break;
			}
		}
	}

	/**
	 * 给所有在线用户发送消息
	 *
	 * @param message
	 */
	public void sendMessageToUsers(TextMessage message) {
		for (String username : userMap.keySet()) {
			WebSocketSession session = userMap.get(username);
			try {
				if (session.isOpen()) {
					session.sendMessage(message);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public String getUsername(WebSocketSession session) {
		String username = null;
		username = (String) session.getAttributes().get("WEBSOCKET_USERNAME");
		if (username != null) {
			return username;
		}
		return username;
	}

}

4.实现效果图

本文参考:https://www.baidu.com/

源码下载地址:https://download.youkuaiyun.com/download/yuwen_forjava/10584951

下载前必读:源码案例仅仅只是一个可以跑起来的代码,对新手意义重大,很有参考价值。并且源码的扩继续拓展,如:实现单人聊天,实现用户头像,实现未读消息和历史记录查看(结合数据库)等等。

 

至此,完成。

 

 

Java WebSocket实现网络聊天室(群聊+私聊) WebChat聊天室 2018.02.26 源码地址早就贴了呀, 留邮箱不如自己下载 项目地址: https://github.com/Amayadream/WebChat 2017.01.11更新 - 使用mysql替换oracle - 整理了一下结构, 删除了多余的代码 一.实现效果(这里图片被压缩了,可以右键查看图片) 登陆页面 聊天室 个人设置 头像修改... 阅读详情

相关推荐

基于websocket的简易聊天室的实现

用java实现基于websocket的简易聊天室    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。

陈半仙的八卦阵 1万+

SpringBoot整合WebSocket,最新教程,细到极致

大家好鸭,最近在和第三方做数据对接,老哥需要整个WebSocket发送数据。我当时在想,为什么不用kafka呢,或者其他消息中间件。emm…,这个不深究了 下面,我们用Springboot 2.6.4 整合Websocet 1、导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star

gubeichengxuyuan的博客 5254

【WebSocket】java使用WebSocket搭建简单聊天室

本次使用的WebSocket 来搭建简单的聊天室,主要就是熟悉WebSocket是什么,能做什么的简单入门介绍 网络摘抄 websocket是什么? 答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 为什么需要websocket? 疑问? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答: 因为 HTTP 协议有一个缺陷:通信只能由客户端发起 我们都知道轮询的效率低,非常浪费资源(因为必须不停连接...

嗟鸠食桑 2161

websocket的详解

------这东西到底有什么用途,仔细看了说明,还是不明所以。楼上几位能不能介绍一下实际使用的场景?? 1.可以实现 服务器端(delphi&lazarus@win)手机端 ssl加密通讯&用户认证  2.可以实现 服务器端(delphi&lazarus@win)手机端 消息推送  3.可以实现 服务器端(delphi&lazarus@win)手机端 数据集(json)互传 4.可以实

shaifu3328的博客 647

WebSocket实现简易版的多人聊天室

一、websocket简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。(百度百科) 二、多人聊天室的实现 1、后端服务器 (1)后端...

A798443266的博客 1500

WebSocket实现聊天室

WebSocket实现聊天室

qq_35310348的博客 1095

Spring中WebSocket的使用

Spring 中使用 WebSocket 实现服务器主动向客户端发送数据

不能再留遗憾了的博客 4029

从MySQL到数据仓库:手把手教你用Airflow实现自动化ETL流水线

本文详细介绍了如何利用Airflow构建从MySQL到数据仓库的自动化ETL流水线,涵盖增量抽取策略、PySpark转换优化和数据质量监控等实战细节。特别适合中小规模企业构建高效数据仓库,提升数据处理效率和质量。

rnn9storyteller的博客 829

最全面的SpringMVC教程(六)——WebSocket

本文为【SpringMVC教程】WebSocket相关知识介绍,具体将对WebSocket进行简介,并通过实战案例对WebSocket的使用进行详尽介绍~

小新要变强的博客 6650

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码)

本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。

sre5engineer的博客 741

告别连接难题:Windows 11下Multisim主数据库稳定运行终极配置指南

本文详细解析了Windows 11下Multisim 14.0主数据库连接失败的三大根源,并提供了四步终极解决方案,包括系统环境优化、软件权限配置、注册表修复和网络验证绕过技巧。通过实测数据对比,本方案显著提升了启动速度和稳定性,解决了电子仿真中的常见连接问题。

weixin_33738555的博客 436

使用WebSocket实现网页聊天室

WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。

黑马程序员官方博客 7176

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6156

vue中使用WebSocket与java SpringBoot进行交互实现聊天室

一、简单介绍下HTML5 WebSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 在 WebSocket API ...

web小袋鼠 8533

DSPACE仿真平台的使用

DSPACE仿真平台的使用 文章目录DSPACE仿真平台的使用1.ModelDesk新建项目2.MotionDesk引入项目3.ControlDesk引入项目4.项目整合运行 我们使用DSPACE仿真平台软件来模拟小汽车的自动驾驶。 总共需要用到DSPACE大类下的三个软件:ModelDesk、ControlDesk、MotionDesk。 1.ModelDesk新建项目 在桌面上点击ModelDesk图标,打开DSPACE—ModelDesk 选择 File 标签,侧边栏选择 New,点击 New A

qq_42582489的博客 7529

【OpenClaw从入门到精通】第63篇:A股智能分析实战——用OpenClaw搭建个人量化研究助手(2026实测版)

2026年,OpenClaw已成为量化投研圈的现象级工具,八家头部券商密集发布专题研报力证其价值。传统量化投研面临技术门槛高、重复劳动多、策略迭代慢、非结构化数据处理弱四大痛点,而OpenClaw通过“AI智能体+金融Skill+量化API”的融合,实现了从数据获取、策略生成、回测验证到持仓监控的全流程自动化。本文基于2026年最新实测经验,完整呈现个人量化研究助手搭建:从阿里云部署、阿里云百炼API配置(含解析失败解决方案)、Tushare数据源接入,到PB-ROE价值选股、研报复现、自动化回测、持仓监控

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1062

实现WebSocket聊天室功能

WebSocket是HTML5的一部分,它为客户端和服务器之间提供了全双工通信通道。与传统的HTTP协议不同,WebSocket允许服务器主动向客户端推送数据,而不仅仅是客户端请求时服务器响应。这使得WebSocket非常适合需要频繁更新的应用,如实时聊天、在线游戏、股票行情等。

codel 984

[Dify] 多步对话流程的实现技巧:构建连贯自然的多轮交互系统

摘要:本文探讨了AI系统中实现多轮对话的核心技术与应用方法。文章首先分析了多步对话的典型场景(如机票预订、财务报告生成)及其价值,提出了Dify平台实现该功能的三大机制:变量系统、条件控制和状态管理。随后详细介绍了顺序型、条件型和确认型三种基本对话模式,并通过"会议预约助手"案例展示了实际应用流程。文章还提供了提示词设计、变量引用等实用建议,并强调多轮对话成功的关键在于清晰的结构设计而非单纯依赖模型能力,最终实现自然流畅的人机交互体验。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1343

SpringBoot + Vue 实现基于 WebSocket 的聊天室(单聊)

前言 在前一篇文章SpringBoot 集成 STOMP 实现一对一聊天的两种方法中简单介绍了如何利用 STOMP 实现单聊,本文则将以一个比较完整的示例展示实际应用,不过本文并未使用 STOMP,而是使用了基础的 websocket 进行实现,如果想利用 STOMP 实现,参考上一篇文章稍加修改即可,此外,建议你阅读以下前置知识,如果比较熟悉就不再需要了: 模拟 Tim 实现自定义的且可动态显示的滚动条 SpringBoot 集成 WebSocket 简单模拟群发通知 云服务器安装redis及与Spri

庄周de蝴蝶的博客 1万+

YOLOv11的对比学习预训练改进-(通过SimCLR预训练增强特征提取)

本文介绍了将SimCLR对比学习预训练与YOLOv11目标检测模型相结合的创新方法。文章首先概述了目标检测领域的发展现状和YOLOv11的架构优化,包括主干网络、特征金字塔和检测头的改进设计。其次详细解析了SimCLR对比学习的核心原理,涵盖数据增强、投影头设计和NT-Xent损失函数。最后探讨了如何将对比学习与目标检测有效结合,通过特征空间对齐和渐进式微调策略提升模型性能。该方法显著增强了特征提取能力,提高了检测精度和训练效率,特别是在小目标和遮挡目标的检测上表现突出。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 687

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot WebSocket之多人聊天室实现

SpringBoot WebSocket之多人聊天室实现WebSocket简介什么是WebSocket?为什么使用WebSocket?WebSocket的技术特点:WebSocket的技术优点:WebSocket事件:实现聊天室的功能功能解析首先实现页面搭建:引入相关的依赖创建 WebSocketUtils 工具类创建接受消息类(ChatRoomServerEndpoint)在启动类中加入@EnableWebSocket 开启 WebSocket 功能实现界面如下图所示: WebSocket简介 什么是W

li22356的博客 1530

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Springboot 整合 WebSocket 实现聊天室功能

WebSocket是一种支持全双工通信的协议,适用于需要实时双向数据传输的场景。与HTTP不同,WebSocket建立持久连接,减少延迟和通信开销。在Spring Boot中集成WebSocket需引入依赖,配置WebSocketConfig类注册端点,并实现WebSocketServer类处理连接、消息收发及群发功能。核心代码包括@ServerEndpoint注解定义服务端、连接管理(onOpen、onClose)和消息处理(onMessage),支持向指定客户端或全体推送消息。通过ServletServ

DD-Blog 1491

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

基于Sping Boot集成的websocket实现聊天室

上面的示例中,我们使用 @ServerEndpoint("/chat/{username}") 注解监听此地址的 WebSocket 信息,客户端也是通过此地址向服务端接收和发送消息。上面的示例中,js中定义了WebSocket通讯相关的代码,如:ws.onopen、ws.onmessage、ws.onclose等事件。然后,分别在三个聊天室页面中,输入三个昵称并加入聊天室,与服务端成功建立WebSocket连接,即可在聊天室发送消息。前面,我们已经把整个WebSocket聊天室的前后台功能介绍完了。

小蜜蜂vs码农 1376

Springboot + Websocket的集成实现简单的聊天室功能

WebSocket是一种网络通信协议,它可以在单个TCP连接上实现双向(全双工)通信。WebSocket使用HTML5标准,并且可以在客户端和服务器之间建立持久连接,这意味着连接在浏览器刷新或关闭后仍然保持打开状态。WebSocket的主要优点包括:1. 双向通信:WebSocket支持客户端和服务器之间的双向通信,这使得实时数据传输变得非常容易。2. 持久连接:WebSocket使用单个TCP连接,这使得服务器可以保持与客户端的通信,即使浏览器被关闭或刷新。

weixin_44315733的博客 2300

WebSocket实现在线聊天室

全双工:允许数据在两个方向上同时传输半双工:允许数据在两个方向上传输,但是同一时间段只允许一个方向传输。

m0_73939789的博客 2953

WebSocket 通信流程,注解和Spring实现WebSocket ,实战多人聊天室系统

实现即时通信常见的有四种方式-分别是:轮询、长轮询(comet)、长连接(SSE)、WebSocket。轮询(Polling)长轮询(Long-Polling)Websocket长连接(SSE)通信协议httphttptcphttp触发方式client(客户端)client(客户端)client、server(客户端、服务端)client、server(客户端、服务端)优点兼容性好容错性强,实现简单比短轮询节约资源全双工通讯协议,性能开销小、安全性高,可扩展性强。

代码是程序员的语言,博客是思想的桥梁,连接你我,共享智慧之光。 3875
上一篇: 使用java实现语音播报
下一篇: 前端js打印功能
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值