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

相关推荐

  • 基于Python实现图像分类

    一, 理论知识 1,1 softmax线性分类器 线性分类器的函数为线性形式,即为(这里将偏置项看做参与乘积的一部分): $$ f(x_1,,,,x_m)=w_0+w_1x_1+
    2024年05月14日
    3 1 1
  • 人事管理系统

    这是一个🔥🔥基于SpringBoot框架的人事管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于Python制作的热血足球小游戏

    基于 Python 制作的热血足球小游戏 导语 最近有读者说我发的文章太水了,都是炒冷饭的,那就带大家整点新鲜的东西吧,反正估计今年都得"坐牢"了,炒冷饭的机会有得是
    2024年05月14日
    5 1 2
  • 基于jsp+servlet+mysql的大学社团交流BBS平台

    这是一个🔥🔥基于jsp的大学社团交流BBS平台🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 大学社团交流BBS开发技术栈为JSP项目,可以作为毕业设计课程设计作业大学生社团作为大学生活的重要一部分
    2024年05月23日
    6 1 2
  • Python 新浪微博爬虫

    Python 新浪微博爬虫,支持模拟登陆,微博文字另存为本地文件 网上大部分对微博的爬虫都是先人工登陆获取cookie再进行接下来的抓取操作的,所以我写了一份模拟登陆获取cookie的(因为是分析为主要目的
    2024年05月14日
    2 1 1
  • 基于SpringBoot框架的酒店客房管理系统

    这是一套采用Java语言编写的🔥🔥酒店客房管理系统的源代码,基于SpringBoot框架构建,我们运用了现代化的SpringBoot和Vue技术栈,开发工具为Idea或Eclipse
    2024年05月23日
    1 1 1
  • Spring boot 实战--- 社区论坛

    Spring boot 实战--- 社区论坛 开发社区首页 开发流程 1 次请求的执行过程 分步实现 开发社区首页
    2024年05月14日
    2 1 2
  • 基于 flask 的 Web 计算器

    基于 flask 的 Web 计算器 需求分析 1, 前言 开发基于 flask 作为框架的计算器 Web 应用是为了能够方便快捷的使用计算器
    2024年05月14日
    22 1 3
  • 基于Python实现成绩统计系统

    1, 课程设计目的 《软件设计基础-Python》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖Python的知识点,又接近工程实际需要
    2024年05月14日
    1 1 1
  • 基于WEB的图书阅读器的实现

    2017-毕业设计(基于 Web 平台的阅读 APP 设计与实现) 该项目实现了一款基于 Web 平台的阅读 APP,该 APP 采用简洁护眼颜色搭配,简洁舒适的设计风格
    2024年05月14日
    2 1 1

发表回复

登录后才能评论