webSocket入门小案例(搭建实时交互的群聊+点对点的交流)

2023-12-31 22:58

本文主要是介绍webSocket入门小案例(搭建实时交互的群聊+点对点的交流),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

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

二、添加依赖

        <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!--前端框架sockjs-client--><dependency><groupId>org.webjars</groupId><artifactId>sockjs-client</artifactId><version>1.1.2</version></dependency><!--前端框架jquery--><dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.4.1</version></dependency><!--前端框架stomp-websocket--><dependency><groupId>org.webjars</groupId><artifactId>stomp-websocket</artifactId><version>2.3.3</version></dependency><dependency><groupId>org.webjars</groupId><artifactId>webjars-locator-core</artifactId></dependency><!--点对点通信需要用到的依赖 主要是为了获取安全登录的用户信息--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

三、创建websocketConfig文件 

@Configuration
@EnableWebSocketMessageBroker //启动websocket消息代理
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Override public void configureMessageBroker(MessageBrokerRegistry registry) {//注册代理对象 /topic 用于群聊广播 ; /user 用于点对点用户通信registry.enableSimpleBroker("/topic","/user"); //全局客户端使用的前缀registry.setApplicationDestinationPrefixes("/app");//点对点使用的前缀 无需配置 默认/user//registry.setUserDestinationPrefix("/user");}//注册stomp端点@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {//允许使用socketJs方式访问 即可通过http://IP:PORT/chat来和服务端websocket连接registry.addEndpoint("/chat").setAllowedOrigins("*").withSockJS();}
}

 配置SecurityConfig

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@BeanPasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("java").password("123").roles("admin").and().withUser("four").password("123").roles("user");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();}
}

 

三、创建接受数据的实体类

 Message:群聊中消息的封装;广播的内容为什么用户发送了什么内容

public class Message {private String name;private String content;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

 Chat:点对点用户的通信

public class Chat {private String from; //发送消息的用户private String content; //消息的内容private String to; // 接收消息的用户public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}
}

四、controller

简单说一下Principal principal这个类  在spring security 的环境下登录后 用户的认证信息会由框架自动封装在Principal中

@Controller
public class GreetingController {@AutowiredSimpMessagingTemplate simpMessagingTemplate;
//    @MessageMapping("/hello")
//    @SendTo("/topic/greetings")
//    public Message greeting(Message message) {
//        return message;
//    }//群聊广播的接口@MessageMapping("/hello")public void greeting(Message message) {simpMessagingTemplate.convertAndSend("/topic/greetings", message);}//单聊的接口@MessageMapping("/chat")public void chat(Principal principal, Chat chat) {chat.setFrom(principal.getName());simpMessagingTemplate.convertAndSendToUser(chat.getTo(), "/user/chat", chat);}
}

五、前端简易页面实现

群聊:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>群聊</title><!--前端框架 --><script src="/webjars/jquery/jquery.min.js"></script><script src="/webjars/sockjs-client/sockjs.min.js"></script><script src="/webjars/stomp-websocket/stomp.min.js"></script>
</head>
<body><table><tr><td>请输入用户名</td><td><input type="text" id="name"></td></tr><tr><td><input type="button" id="connect" value="连接"></td><td><input type="button" id="disconnect" disabled="disabled" value="断开连接"></td></tr>
</table>
<div id="chat" style="display: none"><table><tr><td>请输入聊天内容</td><td><input type="text" id="content"></td><td><input type="button" id="send" value="发送"></td></tr></table><div id="conversation">群聊进行中...</div>
</div>
<script>$(function () {$("#connect").click(function () {connect();})$("#disconnect").click(function () {if (stompClient != null) {stompClient.disconnect();}setConnected(false);})$("#send").click(function () {stompClient.send('/app/hello',{},JSON.stringify({'name':$("#name").val(),'content':$("#content").val()}))})})var stompClient = null;function connect() {if (!$("#name").val()) {return;}var socket = new SockJS('/chat');stompClient = Stomp.over(socket);stompClient.connect({}, function (success) {setConnected(true);stompClient.subscribe('/topic/greetings', function (msg) {showGreeting(JSON.parse(msg.body));});})}function showGreeting(msg) {$("#conversation").append('<div>' + msg.name + ':' + msg.content + '</div>');}function setConnected(flag) {$("#connect").prop("disabled", flag);$("#disconnect").prop("disabled", !flag);if (flag) {$("#chat").show();} else {$("#chat").hide();}}
</script>
</body>
</html>

单聊:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>单聊</title><script src="/webjars/jquery/jquery.min.js"></script><script src="/webjars/sockjs-client/sockjs.min.js"></script><script src="/webjars/stomp-websocket/stomp.min.js"></script>
</head>
<body>
<input type="button" id="connect" value="连接">
<input type="button" id="disconnect" disabled="disabled" value="断开连接">
<hr>
消息内容:<input type="text" id="content">目标用户:<input type="text" id="to"><input type="button" value="发送" id="send">
<div id="conversation"></div>
<script>$(function () {$("#connect").click(function () {connect();})$("#disconnect").click(function () {if (stompClient != null) {stompClient.disconnect();}setConnected(false);})$("#send").click(function () {stompClient.send('/app/chat', {}, JSON.stringify({'to': $("#to").val(),'content': $("#content").val()}))})})var stompClient = null;function connect() {var socket = new SockJS('/chat');stompClient = Stomp.over(socket);stompClient.connect({}, function (success) {setConnected(true);stompClient.subscribe('/user/chat', function (msg) {showGreeting(JSON.parse(msg.body));});})}function showGreeting(msg) {$("#conversation").append('<div>' + msg.from + ':' + msg.content + '</div>');}function setConnected(flag) {$("#connect").prop("disabled", flag);$("#disconnect").prop("disabled", !flag);if (flag) {$("#chat").show();} else {$("#chat").hide();}}
</script>
</body>
</html>

这篇关于webSocket入门小案例(搭建实时交互的群聊+点对点的交流)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE