用 Spring boot 实现 web socket 应用

本贴最后更新于 2254 天前,其中的信息可能已经时异事殊

1、 首先通过 idea 创建一个 Springboot 项目,具体操作步骤如下:

image.png

image.png

点击 next

image.png

点击 next

image.png

按照上图操作

image.png

点击 finish 完成项目
2、 创建好的项目的目录结构

image.png

3、 创建如下的目录结构

image.png

4、 先定义一个常量类备用,代码如下:

package com.example.webscoket.consts; /** * @program: easy * @description: WebScoket常量配置 * @author: 王震 * @create: 2019-05-06 10:11 **/ public class GlobalConsts { /** * @Description Stomp的端点 **/ public static final String ENDPOINT = "/gs-guide-websocket"; /** * @Description 收发消息url前缀 **/ public static final String APP_PREFIX = "/app"; /** * @Description 接收消息地址 **/ public static final String RECEIVE_MAPPING = "/receive"; /** * @Description 点对点消息推送地址前缀 **/ public static final String P2PPUSHBASEPATH = "/user"; /** * @Description 点对点消息推送地址后缀,最后的地址为/user/用户识别码/msg **/ public static final String P2PPUSHPATH = "/msg"; }

代码结构如下:

image.png

5、 创建配置类

package com.example.webscoket.config; import com.example.webscoket.consts.GlobalConsts; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; /** * @Author 王震 * @Description Webscoket配置类 * @Date 21:33 2019/5/6 **/ @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { /** * 配置消息代理 * 启动简单Broker,消息的发送的地址符合配置的前缀来的消息才发送到这个broker */ config.enableSimpleBroker(GlobalConsts.P2PPUSHBASEPATH); config.setUserDestinationPrefix(GlobalConsts.P2PPUSHBASEPATH); config.setApplicationDestinationPrefixes(GlobalConsts.APP_PREFIX); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { /** * 注册 Stomp的端点 * addEndpoint:添加STOMP协议的端点。这个HTTP URL是供WebSocket或SockJS客户端访问的地址 * setAllowedOrigins("*") 允许跨域 * withSockJS:指定端点使用SockJS协议 */ registry.addEndpoint(GlobalConsts.ENDPOINT) .setAllowedOrigins("*") .withSockJS(); } }

程序结构如下:

image.png

6、 定义 POJO 类
接收客户端发过来的消息

package com.example.webscoket.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @program: easy * @description: 客户端发过来的消息 * @author: 王震 * @create: 2019-05-06 10:22 **/ @Data @AllArgsConstructor @NoArgsConstructor public class ClientMessage { private int id; private String name; }

服务端返回的消息

package com.example.webscoket.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @program: easy * @description: 服务端返回消息 * @author: 王震 * @create: 2019-05-06 10:25 **/ @Data @AllArgsConstructor @NoArgsConstructor public class ServerMessage { private String content; }

注意,项目采用了 lombok 和 fastjson,需要在 pom 文件中加载相关依赖

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency>

7、 定义 service 接口和 service 实现类

package com.example.webscoket.service; /** * @Author 王震 * @Description 消息服务接口实现 * @Date 21:46 2019/5/6 **/ public interface SimpMessagingService { /** * @Author 王震 * @Description 定义消息发送模板,点对点发送 * @Date 21:48 2019/5/6 * @Param [user, destination, payload] * @return void **/ void sendP2P(String user, String destination, Object payload); }
package com.example.webscoket.service.impl; import com.example.webscoket.service.SimpMessagingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; /** * @program: webscoket * @description: 消息服务接口实现 * @author: 王震 * @create: 2019-05-06 21:48 **/ @Service public class SimpMessagingServiceImpl implements SimpMessagingService { @Autowired private SimpMessagingTemplate template; /** * @Author 王震 * @Description 定义消息发送模板,点对点发送 * @Date 21:48 2019/5/6 * @Param [user, destination, payload] * @return void **/ @Override public void sendP2P(String user, String destination, Object payload) { template.convertAndSendToUser(user, destination, payload); } }

8、 创建控制类,用于接收和响应消息

package com.example.webscoket.controller; import com.alibaba.fastjson.JSON; import com.example.webscoket.consts.GlobalConsts; import com.example.webscoket.service.SimpMessagingService; import com.example.webscoket.vo.ClientMessage; import com.example.webscoket.vo.ServerMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.stereotype.Controller; import org.springframework.web.util.HtmlUtils; /** * @program: easy * @description: webscoket测试controller * @author: 王震 * @create: 2019-05-06 10:26 **/ @Controller public class ScoketController { @Autowired private SimpMessagingService simpMessagingService; /** * @Author 王震 * @Description 接收和相应消息 * @Date 16:42 2019/5/7 * @Param [message] * @return void **/ @MessageMapping(GlobalConsts.RECEIVE_MAPPING) public void scoket(ClientMessage message){ simpMessagingService.sendP2P(message.getId() + "", GlobalConsts.P2PPUSHPATH, JSON.toJSON(new ServerMessage("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"))); } }

9、 这样整个服务端的程序就搭建完成了,整体的代码结构如下图所示:

image.png

10、 现在编写测试程序,先下载相关的 js 库支持,如下图所示:

image.png

11、 编写测试页面,代码如下:

<!DOCTYPE html> <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>WebScoket测试</title> <script src="./test/jquery.min.js"></script> <script src="./test/sockjs.min.js"></script> <script src="./test/stomp.min.js"></script> </head> <body onload="disconnect()"> <div> <div> <button id="connect" onclick="connect();" disabled="">连接</button> <button id="disconnect" onclick="disconnect();">断开连接</button> </div> <div id="conversationDiv" style="visibility: visible;"> <label>输入你的名字</label><input type="text" id="name"> <button id="sendName" onclick="sendName();">发送</button> <p id="response"></p> </div> </div> <script type="text/javascript"> var stompClient = null; function setConnected(connected) { document.getElementById('connect').disabled = connected; document.getElementById('disconnect').disabled = !connected; document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden'; $('#response').html(); } function connect() { // websocket的连接地址,此值等于WebSocketMessageBrokerConfigurer中registry.addEndpoint("/websocket-simple").withSockJS()配置的地址 var socket = new SockJS('http://localhost:8080/gs-guide-websocket'); stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { setConnected(true); console.log('Connected: ' + frame); // 客户端订阅消息的目的地址:此值BroadcastCtl中被@SendTo("/topic/getResponse")注解的里配置的值 stompClient.subscribe('/user/' + 123 + '/msg', function(respnose){ showResponse(JSON.parse(respnose.body).content); }); }); } function disconnect() { if (stompClient != null) { stompClient.disconnect(); } setConnected(false); console.log("Disconnected"); } function sendName() { var name = $('#name').val(); // 客户端消息发送的目的:服务端使用BroadcastCtl中@MessageMapping("/receive")注解的方法来处理发送过来的消息 stompClient.send("/app/receive", {}, JSON.stringify({ 'id': 123, 'name': name })); } function showResponse(message) { var response = $("#response"); response.html(message + "\r\n" + response.html()); } </script> </body></html>

12、 启动 java 程序,页面用浏览器打开,出现如下效果,证明搭建成功。

image.png
image.png
image.png

13、 项目下载

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 279 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • CodeMirror
    2 引用 • 17 回帖 • 173 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 104 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 224 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    955 引用 • 944 回帖
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 130 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    694 引用 • 537 回帖 • 1 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 613 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 409 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 799 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖 • 2 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 641 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 565 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 534 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 7 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 733 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 8 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 407 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 642 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 39 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 3 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖