Spring Boot 开发私有即时通信系统(WebSocket)

1/ 概述

利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天。

2/ 所需依赖

Spring Boot 版本 1.5.3,使用MongoDB存储数据(非必须),Maven依赖如下:

<properties>
 <java.version>1.8</java.version>
 <thymeleaf.version>3.0.0.RELEASE</thymeleaf.version>
 <thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version>
 </properties>

 <dependencies>

 <!-- WebSocket依赖,移除Tomcat容器 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
  <exclusions>
  <exclusion>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
  </exclusion>
  </exclusions>
 </dependency>

 <!-- 使用Undertow容器 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-undertow</artifactId>
 </dependency>

 <!-- Spring Security 框架 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
 </dependency>

 <!-- MongoDB数据库 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
 </dependency>

 <!-- Thymeleaf 模版引擎 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>

 <dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.16</version>
 </dependency>

 <dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.30</version>
 </dependency>

 <!-- 静态资源 -->
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>webjars-locator</artifactId>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>sockjs-client</artifactId>
  <version>1.0.2</version>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>stomp-websocket</artifactId>
  <version>2.3.3</version>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>bootstrap</artifactId>
  <version>3.3.7</version>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>jquery</artifactId>
  <version>3.1.0</version>
 </dependency>

 </dependencies>

配置文件内容:

server:
 port: 80

# 若使用MongoDB则配置如下参数
spring:
 data:
 mongodb:
  uri: mongodb://username:password@172.25.11.228:27017
  authentication-database: admin
  database: chat

大致程序结构,仅供参考:

3/ 创建程序启动类,启用WebSocket

使用@EnableWebSocket注解

@SpringBootApplication
@EnableWebSocket
public class Application {

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

}

4/ 配置Spring Security

此章节省略。(配置好Spring Security,用户能正常登录即可)

5/ 配置Web Socket(结合第7节的JS看)

@Configuration
@EnableWebSocketMessageBroker
@Log4j
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

 // 此处可注入自己写的Service

 @Override
 public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
 // 客户端与服务器端建立连接的点
 stompEndpointRegistry.addEndpoint("/any-socket").withSockJS();
 }

 @Override
 public void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
 // 配置客户端发送信息的路径的前缀
 messageBrokerRegistry.setApplicationDestinationPrefixes("/app");
 messageBrokerRegistry.enableSimpleBroker("/topic");
 }

 @Override
 public void configureWebSocketTransport(final WebSocketTransportRegistration registration) {
 registration.addDecoratorFactory(new WebSocketHandlerDecoratorFactory() {
  @Override
  public WebSocketHandler decorate(final WebSocketHandler handler) {
  return new WebSocketHandlerDecorator(handler) {
   @Override
   public void afterConnectionEstablished(final WebSocketSession session) throws Exception {
   // 客户端与服务器端建立连接后,此处记录谁上线了
   String username = session.getPrincipal().getName();
   log.info("online: " + username);
   super.afterConnectionEstablished(session);
   }

   @Override
   public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
   // 客户端与服务器端断开连接后,此处记录谁下线了
   String username = session.getPrincipal().getName();
   log.info("offline: " + username);
   super.afterConnectionClosed(session, closeStatus);
   }
  };
  }
 });
 super.configureWebSocketTransport(registration);
 }
}

6/ 点对点消息,群消息

@Controller
@Log4j
public class ChatController {

 @Autowired
 private SimpMessagingTemplate template;

 // 注入其它Service

 // 群聊天
 @MessageMapping("/notice")
 public void notice(Principal principal, String message) {
 // 参数说明 principal 当前登录的用户, message 客户端发送过来的内容
 // principal.getName() 可获得当前用户的username 

 // 发送消息给订阅 "/topic/notice" 且在线的用户
 template.convertAndSend("/topic/notice", message);
 }

 // 点对点聊天
 @MessageMapping("/chat")
 public void chat(Principal principal, String message){
 // 参数说明 principal 当前登录的用户, message 客户端发送过来的内容(应该至少包含发送对象toUser和消息内容content)
 // principal.getName() 可获得当前用户的username

 // 发送消息给订阅 "/user/topic/chat" 且用户名为toUser的用户
 template.convertAndSendToUser(toUser, "/topic/chat", content);
 }

}

7/ 客户端与服务器端交互

 var stompClient = null;

 function connect() {
  var socket = new SockJS('/any-socket');
  stompClient = Stomp.over(socket);
  stompClient.connect({}, function (frame) {
   // 订阅 /topic/notice 实现群聊
   stompClient.subscribe('/topic/notice', function (message) {
    showMessage(JSON.parse(message.body));
   });
   // 订阅 /user/topic/chat 实现点对点聊
   stompClient.subscribe('/user/topic/chat', function (message) {
    showMessage(JSON.parse(message.body));
   });
  });
 }

 function showMessage(message) {
  // 处理消息在页面的显示
 }

 $(function () {
  // 建立websocket连接
  connect();
  // 发送消息按钮事件
  $("#send").click(function () {
   if (target == "TO_ALL"){
    // 群发消息
    // 匹配后端ChatController中的 @MessageMapping("/notice")
    stompClient.send("/app/notice", {}, '消息内容');
   }else{
    // 点对点消息,消息中必须包含对方的username
    // 匹配后端ChatController中的 @MessageMapping("/chat")
    var content = "{'content':'消息内容','receiver':'anoy'}";
    stompClient.send("/app/chat", {}, content);
   }
  });
 });

8/ 效果测试

登录三个用户:Anoyi、Jock、超级管理员。

群消息测试,超级管理员群发消息:

点对点消息测试,Anoyi给Jock发送消息,只有Jock收到消息,Anoyi和超级管理员收不到消息:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解spring boot实现websocket

    前言 QQ这类即时通讯工具多数是以桌面应用的方式存在.在没有websocket出现之前,如果开发一个网页版的即时通讯应用,则需要定时刷新页面或定时调用ajax请求,这无疑会加大服务器的负载和增加了客户端的流量.而websocket的出现,则完美的解决了这些问题. spring boot对websocket进行了封装,这对实现一个websocket网页即时通讯应用来说,变得非常简单.  一.准备工作 pom.xml引入 <dependency> <groupId>org.spring

  • 详解spring boot Websocket使用笔记

    本文只作为个人笔记,大部分代码是引用其他人的文章的. 在springboot项目中使用websocket做推送,虽然挺简单的,但初学也踩过几个坑,特此记录. 使用websocket有两种方式:1是使用sockjs,2是使用h5的标准.使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法. 1.pom 核心是@ServerEndpoint这个注解.这个注解是Javaee标准里的注解,tomcat7以上已经对其进行了实现,如果是用传统方法使用tomcat发布项目,只要在pom文件中引入j

  • 使用 Spring Boot 实现 WebSocket实时通信

    在开发 Web 应用程序时,我们有时需要将服务端事件推送到连接的客户端.但 HTTP 并不能做到.客户端打开与服务端的连接并请求数据,但服务端不能打开与客户端的连接并推送数据. 为了解决这个限制,我们可以建立了一个轮询模式,网页会间隔地轮询服务器以获取新事件.但这种模式不太理想,因为它增加了 HTTP 开销,速度也只能达到与轮询的速率一样快,并且给服务器增加了不必要的负载. 幸运的是,HTML5 WebSocket 出现了.WebSocket 协议允许浏览器与 Web 服务器之间进行低开销的交互

  • 详解在Spring Boot框架下使用WebSocket实现消息推送

    spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目以及怎样为我们的Project添加HTTPS的支持,在这两篇文章的基础上,我们今天来看看如何在Spring Boot中使用WebSocket. 什么是WebSocket WebSocket为浏览器和服务器之间提供了双工异步通信功能,也就是说我们可以利用浏览器给服务器发送消息,服务器也可以给浏览器发送消息,目前主流浏览器的主流版本对WebSocket的支持都算是比较好的,但是在实际开发中使

  • SpringBoot+Websocket实现一个简单的网页聊天功能代码

    最近做了一个SpringBoot的项目,被SpringBoot那简介的配置所迷住.刚好项目中,用到了websocket.于是,我就想着,做一个SpringBoot+websocket简单的网页聊天Demo. 效果展示: 当然,项目很简单,没什么代码,一眼就能明白 导入websocket的包. 通过使用SpringBoot导入包的时候,我们可以发现,很多包都是以 spring-boot-starter 开头的,对于我这种强迫症 ,简直是福音 <dependency> <groupId>

  • 关于Spring Boot WebSocket整合以及nginx配置详解

    前言 本文主要给大家介绍了关于Spring Boot WebSocket整合及nginx配置的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一:Spring Boot WebSocket整合 创建一个maven项目,加入如下依赖 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId>

  • SpringBoot webSocket实现发送广播、点对点消息和Android接收

    1.SpringBoot webSocket SpringBoot 使用的websocket 协议,不是标准的websocket协议,使用的是名称叫做STOMP的协议. 1.1 STOMP协议说明 STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议. 它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消

  • Spring Boot 开发私有即时通信系统(WebSocket)

    1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 1.5.3,使用MongoDB存储数据(非必须),Maven依赖如下: <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.0.RELEASE</thymeleaf.ve

  • Spring Boot 开发环境热部署详细教程

    在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况,同样也同样需要经历重新编译.重新启动程序的过程. 只不过 Spring Boot 提供了一个spring-boot-devtools的模块,使得 Spring Boot应用支持热部署,无需手动重启Spring Boot应用,,提高开发者的开发效率.接下来,聊一聊Spring Boot 开发环境热部署

  • spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程

    本篇我将继续向小伙伴介绍springboot配置文件的配置,已经全局配置参数如何使用,好了下面开始我们今天的内容介绍. 我们知道Spring Boot支持容器的自动配置,默认是Tomcat,当然我们也是可以进行修改的: 1.首先我们排除spring-boot-starter-web依赖中的Tomcat:在pom文件中排除tomcat的starter <dependency> <groupId>org.springframework.boot</groupId> <

  • macOS下Spring Boot开发环境搭建教程

    macOS搭建Spring Boot开发环境,具体内容如下 软硬件环境 macOS Sierra java 1.8.0_65 maven 3.5.0 idea 2017.1.5 前言 最近接触了一点java web相关的知识,了解一下最近比较火的开发框架Spring Boot,站在一个从未涉足过java web和spring的开发者角度来讲,spring boot确实是一个非常不错的框架,配置简单,容易入门,对于想入行java web的童鞋,是一个很好的切入点. maven安装 这里选择mave

  • 浅谈Spring Boot 开发REST接口最佳实践

    本文介绍了Spring Boot 开发REST接口最佳实践,分享给大家,具体如下: HTTP动词与SQL命令对应 GET 从服务器获取资源,可一个或者多个,对应SQL命令中的SELECT GET /users 获取服务器上的所有的用户信息 GET /users/ID 获取指定ID的用户信息 POST 在服务器上创建一个新资源,对应SQL命令中的CREATE POST /users 创建一个新的用户 PUT 在服务器上更新一个资源,客户端提供改变后的完整资源,对应SQL命令中的UPDATE PUT

  • spring boot 开发soap webservice的实现代码

    介绍 spring boot web模块提供了RestController实现restful,第一次看到这个名字的时候以为还有SoapController,很可惜没有,对于soap webservice提供了另外一个模块spring-boot-starter-web-services支持.本文介绍如何在spring boot中开发soap webservice接口,以及接口如何同时支持soap和restful两种协议. soap webservice Web service是一个平台独立的,低耦

  • 使用spring boot开发时java对象和Json对象转换的问题

    将java对象转换为json对象,市面上有很多第三方jar包,如下: jackson(最常用) <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind&l

  • Spring Boot开发RESTful接口与http协议状态表述

    目录 一.RESTful风格API的好处 二.RESTfulAPI的设计风格 2.1.RESTful是面向资源的(名词) 2.2.用HTTP方法体现对资源的操作(动词) 2.3.HTTP状态码 2.4.Get方法和查询参数不应该改变数据 2.5.使用复数名词 2.6.复杂资源关系的表达 2.7.高级用法:HATEOAS 2.8.资源过滤.排序.选择和分页的表述 2.9.版本化你的API 参考: 一.RESTful风格API的好处 API(Application Programming Inter

  • 详解使用Spring Boot开发Web项目

    前面两篇博客中我们简单介绍了spring Boot项目的创建.并且也带小伙伴们来DIY了一个Spring Boot自动配置功能,那么这些东西说到底最终还是要回归到Web上才能体现出它的更大的价值,so,今天我们就来看一下如何使用Spring Boot来开发Web项目.当然,如果小伙伴对Spring Boot尚不熟悉的话,可以先参考一下这两篇博客: 1.初识Spring Boot框架 2.初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置 Spring Boot 提供

  • 详解使用Spring Boot开发Restful程序

    一.简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理.在去年的SpringOne 2GX会议上,Pivotal的CTO Adria

随机推荐