SpringBoot +WebSocket 实现点对点/广播聊天

SpringBoot +WebSocket 实现点对点/广播聊天 简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议

本文包含相关资料包-----> 点击直达获取<-------

SpringBoot +WebSocket 实现点对点/广播聊天

简介

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

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

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现推送技术,所用的技术都是 AJAX 轮询 。轮询是在特定的的时间间隔(如每 1 秒),由浏览器对服务器发出 HTTP 请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而 HTTP 请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更 实时地进行通讯。

轮询: 不断地向服务器发送请求,服务器也频繁的被动回应请求;

WebSocket:由服务器向客户端主动发起回应;

1. pom.xml

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

2. WebSocketConfig

```java /* * @author Dazhi * @date 2019/4/25 20:40 / @Component public class WebSocketConfig {

/**
 * 注入ServerEndpointExporter
 */
@Bean
public ServerEndpointExporter serverEndpointExporter(){
    return new ServerEndpointExporter();
}

} ```

3. MessageVO

```java /* * @author Dazhi * @date 2019/4/25 20:45 / @Data public class MessageVo {

/**
 * 消息生产者ID
 */
private String productorId;
/**
 * 消息消费者者ID
 */
private String comsumerId;
/**
 * 消息
 */
private String message;
/**
 * 生产者昵称
 */
private String nickname;

} ```

4. WebSocketServer(重点)

```java /* * @author Dazhi * @date 2019/4/25 20:50 /

@ServerEndpoint("/websocket/{userId}") @Component @Slf4j public class WebSocket { /* * String : 用户ID * Session: 回话 / public static Map sessionMap = new ConcurrentHashMap ();

/**
 * onOpen是当用户发起连接时,会生成一个用户的Session 注意此Session是 javax.websocket.Session;
 * 然后我们用userId作为Key Session作为Vaule存入Map中暂存起来
 *
 * @param userId
 * @param session
 */
@OnOpen
public void onOpen(@PathParam("userId") String userId, Session session) {
    log.info("====>WebSocketService onOpen: " + userId);
    if (sessionMap == null) {
        sessionMap = new ConcurrentHashMap<String, Session>();
    }
    sessionMap.put(userId, session);
}

/**
 * onClose 是用户关闭聊天窗时,将用户session移除
 *
 * @param userId
 */
@OnClose
public void onClose(@PathParam("userId") String userId) {
    log.info("====>WebSocketService OnClose: " + userId);
    sessionMap.remove(userId);
}

/**
 * onMessage 实现聊天功能, message是前端传来的JSON字符串。其中含有MessageVo里的信息。根据vo实现点对点/广播聊天。
 *
 * @param message
 */
@OnMessage
public void onMessage(String message) {
    log.info("====>WebSocketService OnMessage: " + message);
    MessageVo vo = JSON.parseObject(message, MessageVo.class);
    if (vo.getConsumerId() == null || vo.getConsumerId().isEmpty()) {
        //广播
        toAll(message);
    } else {
        //点对点
        one2one(vo, message);
    }
}

/**
 * 当出现异常时候自动调用该方法。
 *
 * @param t
 */
@OnError
public void error(Throwable t) {
    t.printStackTrace();
}

    /**
 * 点对点
 *  session.getAsyncRemote().sendText(message); 即向目标session发送消息。
 *  
 */
private static void one2one(MessageVo vo, String message) {
    Session consumerSession = sessionMap.get(vo.getConsumerId());
    if (consumerSession == null) {
        log.info("消息消费者不存在");
    } else {
        consumerSession.getAsyncRemote().sendText(message);
    }
}


/**
 * 广播
 * 向所有session发送消息
 */
private static void toAll(String message) {
    for (Session session : sessionMap.values()) {
        session.getAsyncRemote().sendText(message);
    }

}

} ```

5. 页面 HTML

用 Easyui 快速搭建

```html

聊天室

帐号: 昵称: 发送给: 开始聊天

```

6.效果

搭建完成后我们启动浏览器来看看效果

发送给中若是不填,则会进行群发。实际开发中,灵活变动。

参考文献

  • 基于Openfire服务器iOS即时通讯系统的设计与实现(吉林大学·郭卓)
  • 基于OAuth2.0协议的企业分布式授权系统设计与实现(华中科技大学·支猛)
  • 企业内部即时通讯系统的设计与实现(内蒙古大学·王慧平)
  • 基于微服务的社交系统的设计与实现(北京邮电大学·赵岩)
  • 基于OAuth2.0协议的企业分布式授权系统设计与实现(华中科技大学·支猛)
  • 户外运动资讯平台的设计与实现(华中科技大学·高昌仁)
  • 分布式聊天服务子系统的设计与实现(南京大学·周鹏)
  • 基于Openfire服务器iOS即时通讯系统的设计与实现(吉林大学·郭卓)
  • 基于微服务的社交系统的设计与实现(北京邮电大学·赵岩)
  • 基于J2EE的网上交友系统的设计与实现(大连理工大学·姚岚)
  • “Things-Cloud-People”:一个“Web of Things”实现方案(华东师范大学·汤承刚)
  • 基于WebRTC的视频会议系统的设计与实现(西北大学·孙凯龙)
  • 统一用户管理系统开发与设计(南昌大学·郭妍)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 基于SSH的大学生联谊交友管理系统设计与实现(华中科技大学·王海波)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码项目助手 ,原文地址:https://m.bishedaima.com/yuanma/35845.html

相关推荐

  • 基于Java的新闻热点与趋势挖掘工具

    基于Java的新闻热点与趋势挖掘工具 一,项目概述 1,1 项目简介 本项目为一个新闻站点文章爬取和分析工具,能够通过抓取一定时间内某个新闻网站上所发布的所有新闻
    2024年05月14日
    2 1 1
  • 迷宫求解之Python

    迷宫求解 一,必做任务一 使用强化学习算法,对于给定的迷宫,训练老鼠在迷宫中寻找蛋糕, 迷宫与图中类似,黑色格子为墙,不能走,老鼠试图走向墙时,会停在原地
    2024年05月14日
    2 1 1
  • 图书个性化推荐系统

    这是一个🔥🔥基于SpringBoot框架的图书个性化推荐系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于web的网上书城系统

    基于web的网上书城系统 一,摘要 随着前端各种新兴技术的崛起,我们编写前端已经不仅仅局限于html,css,js,而是有了更多的选择,用更加简洁的代码就可以实现更加完美的功能
    2024年05月14日
    2 1 1
  • 基于Python实现网络安全传输系统

    文件传输系统报告 实验目的 ​ 在当下的大数据和人工智能时代,数据的重要性已经愈来愈重要,但是文件作为数据在计算机系统中的重要载体,在网络传输的过程中容易被监听嗅探
    2024年05月14日
    17 1 6
  • Python程序设计#4作业

    Python程序设计#4作业 作业题目 基于#3作业获取的数据(No_Smoothing,非平滑数据),计算出LOWESS(局部加权回归,fraction取前后各5年的数据)结果
    2024年05月14日
    2 1 1
  • Python实现基于主动学习的实体关系抽取

    基于主动学习的关系抽取题目方法研究 摘要 当代社会的知识已呈爆炸性增长,其中最常见的知识蕴含在非结构化的自然语言文本当中,信息抽取(Information Extraction)技术通过一组被提及的实体
    2024年05月14日
    2 1 1
  • SpringBoot构建电商基础秒杀项目

    SpringBoot构建电商基础秒杀项目 项目环境:IDEA,maven,MySQL5,x 项目运行方式:从IDEA导入项目,更新maven依赖,然后在MySQL数据库中运行miaosha
    2024年05月14日
    5 1 3
  • 基于SpringBoot框架的社区智慧养老监护管理平台

    这是一套采用Java编程语言,基于SpringBoot框架构建的智能化社区养老监护管理系统源代码,开发工具为Idea或Eclipse,采用了现代化的SpringBoot和Vue技术栈
    2024年05月23日
    4 1 1
  • 基于Jsp和MySQL的数据统计系统

    基于Jsp和MySQL的数据统计系统 1, 概述 1,1 开发背景 参照 Java 大作业的要求,需要实现一个面向自贸试验区领导机关的统计系统,实现以下功能:采集片区的数据信息(重点为企业注册登记信息)
    2024年05月14日
    11 1 5

发表回复

登录后才能评论