本文主要来讲解如何使用WebSocket来实现一个简易的群聊功能

引入maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.5.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.2.5.RELEASE</version>
</dependency>

项目的目录结构

接下来,我们来分析每个类的作用。

WebSocketApplication

@SpringBootApplication
public class WebSocketApplication {public static void main(String[] args) {SpringApplication.run(WebSocketApplication.class, args);}
}

这个类就是一个简单的启动引导类的功能。

WebSocketServer:群聊核心类

@Component
@ServerEndpoint(value = "/chat/{username}", configurator = SpringBasedConfigurator.class)
public class WebSocketServer {private final Map<Session, String> userSessionMap = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("username") String username) {userSessionMap.put(session, username);multicastMessage(session, "欢迎" + username + "加入群聊!");}@OnMessagepublic void onMessage(Session session, String message) {String username = userSessionMap.get(session);multicastMessage(session, username + ": " + message);}@OnClosepublic void onClose(Session session) {String username = userSessionMap.remove(session);multicastMessage(session, username + "退出群聊。");}private void multicastMessage(Session session, String message) {for (Session userSession : userSessionMap.keySet()) {if (userSession == session) {//是自己,忽略continue;}try {userSession.getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}}}
}

@ServerEndpoint:作用是用来表明当前类是一个节点类,当连接成功之后,用户的操作都会回调这个类对应的对象的方法,对象怎么创建的是根据configurator 属性对应的类来实现的,默认是每个连接对应的对象都是通过反射构建的,但是对于本群聊功能来说,是通过SpringBasedConfigurator对象来获取,这个类的作用接下来会剖析。

@OnOpen:当客户端与服务端建立连接的时候,会回调 @OnOpen 注解标记的方法

@PathParam:可以看成跟spring mvc中的@PathVariable注解作用一样,就是取出连接路径中的占位符对应的值

@OnMessage:当客户端发送消息给服务端的时候,会回调OnMessage 注解标记的方法

@OnClose:当客户端断开连接的时候,会回调@OnClose注解标记的方法。

Session:是代表当前客户端与服务端建立的一个会话,通过这个对象,服务端可以主动给客户端发送消息。

WebSocketServer这个类的主要作用是保存每个客户端与服务端建立的连接,一旦有客户端跟服务端建立连接、发送消息、断开连接,都会发送消息给其他客户端,从而实现群聊的功能

SpringBasedConfigurator

@Component
public class SpringBasedConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringBasedConfigurator.applicationContext = applicationContext;}@Overridepublic <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {return applicationContext.getBean(clazz);}}

这个类是继承了WebSocket包提供的api ServerEndpointConfig.Configurator ,重写了 getEndpointInstance 方法,主要是因为WebSocket是通过调用getEndpointInstance方法来获取每个连接对应调用的对象, 而getEndpointInstance方法默认是通过直接通过反射构造的,而不是从spring容器获取连接对象,导致类中的像@Resource 这类注解无法生效,所以重写了getEndpointInstance方法,让每个连接对应调用的对象都是从spring容器中获

WebSocketConfiguration:配置类

@Configuration
public class WebSocketConfiguration {/*** 这个类的主要注册每个加了{@link javax.websocket.server.ServerEndpoint}的 spring bean节点,这算是spring整合websocket的一个体现* 具体是怎么实现注册的,可以看看 {@link ServerEndpointExporter#afterSingletonsInstantiated()}方法的实现** @return*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

暴露每个加@ServerEndpoint注解的spring bean,算是spring跟WebSocket整合的一处体现。

测试

好了,说完这些类的功能,那么开启测试吧。WebSocket客户端,我们使用https://www.idcd.com/tool/socket网站来模拟。

通过启动引导类来启动项目之后,我们输入 ws://localhost:8080/chat/sanyou, 建立一个连接,模拟一个客户端。

输入连接地址,点击连接,就会显示连接成功,username这里我们填sanyou,填什么都无所谓,相当于一个名字。

我们再建立一个连接,模拟另一个客户端。

第一个客户端就会显示这条信息。

接下来,就可以在发送栏往服务端发送消息,服务端会转给其他的客户端,实现群聊的功能,效果如下。

如果还想加入群聊,另外建立连接就行了,这样,一个简易的群聊功能就完成了。

以上就是本篇文章的全部内容,代码我已经上传到https://github.com/sanyou3/sanyou-parent.git 仓库上了,有更详细的注释,如有需要欢迎自行clone,同时如果你有什么不懂或者想要交流的地方,欢迎关注我的个人的微信公众号三友的java日记或者添加我的微信ZZYNKXJH联系我,我们下篇文章再见。

如果觉得这篇文章对你有所帮助,还请帮忙点赞、在看、转发一下,码字不易,非常感谢!

基于WebSocket实现一个简易的群聊功能相关推荐

  1. 基于Vue+springboot+websocket实现的简短仿微信web聊天室(私聊和群聊功能)(可在线预览)

    写目录 一.界面展示 二.介绍 一.界面展示 之前闲着有空就给自己的个人博客搭了一些附加功能,聊天室也是其中之一,简单的实现了私聊.群聊功能,可以发送emoji表情和图片等,项目已经部署在www.tc ...

  2. socket.io简易教程(群聊,发送图片,分组,私聊)

    什么是Socket.io? 过去: 由于http是无状态的协议,所以实现聊天等通信功能非常困难,当别人发送一条消息时,服务器并不知道当前有哪些用户等着收消息,所以以前实现聊天通信功能最普遍的就是轮询机 ...

  3. 基于websocket实现一个简单的IM即时聊天

    基于websocket实现一个简单的IM即时聊天 websocket闲聊 如何实现一个简单的聊天程序 实践 代码 效果 登陆 聊天 websocket闲聊 简而言之,就是一种服务器和客户端可以双向通信 ...

  4. 基于Vue实现一个简易的小程序框架,浅谈kafka | 每日掘金第 194 期

    Hello,又到了每天一次的下午茶时间.酱酱们的下午茶新增优质作者介绍和码上掘金板块,专注于发掘站内优质创作者和优质内容,欢迎大家多提宝贵意见! 酱酱们的下午茶全新改版,欢迎大家多提宝贵意见! 本文字 ...

  5. 利用Socket实现一个简单的群聊系统

    系统需求 1.实现多个用户即时通信的群聊功能 实现分析 1.当服务端接入一个客户端时,为避免阻塞,并接受其他客户端的接入,为该socket开一个线程管理它. 2.当所接入的客户端中,有客户端发送信息时 ...

  6. 用C++/MFC实现P2P和群聊功能的聊天小软件

    final edit 2015-01-03 · 实现平台: Window 8.1,Visual Studio 2013 Window 7, Visual Studio 2010 · 所用框架: 是基于 ...

  7. UDP实现简单的群聊功能代码示例

    以下是UDP实现群聊功能代码示例 在java中,通过两个特定类来实现UDP协议顶层数据报,分别是DatagramPacket和DatagramSocket,其中类DatagramPacket是一个数据 ...

  8. iOS微信QQ聊天界面的UI框架以及Socket简单实现群聊功能

    7.1日更新 Python3 TCP Demo相关 https://blog.csdn.net/Deft_MKJing/article/details/80851879 2.2日更新,socket简易 ...

  9. 360搜索、UC浏览器等被3·15点名应用已下架;马斯克宣布通过NFT卖歌;美团App再发力社交,内测 “群聊”功能 |极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 丁恩华 出品 | CSDN(ID:CSDNnews ...

最新文章

  1. TortoiseSVN使用详细步骤(一)
  2. 自定义ViewGroup实现ViewPager的滑动效果
  3. emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
  4. string学习笔记1
  5. java dog类型_java泛型中?和T有什么区别?
  6. 《转》请放下你的无效社交
  7. 估计很多前端都没学过单元测试~
  8. java仿qq空间音乐播放_完美实现仿QQ空间评论回复特效
  9. to_date , to_char
  10. com/fasterxml/jackson/core/exc/InputCoercionException
  11. java关键字false_无聊,null,true,false是java关键字吗
  12. Audition CC 2019 for Mac中文破解版永久激活方法附破解补丁
  13. 出租车计费程序php,出租车计价器VHDL程序
  14. VirtualBox增强功能无法安装
  15. vue上传图片限制格式以及尺寸大小
  16. PROGRESSIVE GROWING OF GANS FOR IMPROVED QUALITY, STABILITY, AND VARIATION(PGGAN)
  17. 微信小程序:个人页面/我的页面/资料页面
  18. 时间都去哪儿了,你又想让它去哪儿
  19. 小学数学测试软件报告,第二学小学数学期末测试质量分析报告
  20. Codeforces--44A--Indian Summer

热门文章

  1. !!!---1588|Sum of All Odd Length Subarrays(新)
  2. 国内的人工智能神经网络研究院有哪些
  3. SAP中非限制到冻结库存的相互转换操作测试过程记录
  4. .NET Micro Framework简介
  5. ORA-00933: SQL 命令未正确结束处理办法
  6. 使用联邦学习解决推荐系统中的隐私泄露问题
  7. 利用字典实现大侠个人信息查询程序
  8. 二、zookeeper客户端使用和集群特性
  9. python的plt绘制子图_Matplotlib 多子图绘制
  10. 线上引流方法有哪些?怎么做线上引流推广?线上引流推广方法