阿里云开发者社区

电脑版
提示:原网页已由神马搜索转码, 内容由developer.aliyun.com提供.

【spring(六)】WebSocket网络传输协议

2024-03-1661
版权
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介:【spring(六)】WebSocket网络传输协议

🌈键盘敲烂,年薪30万🌈



核心概要:

websocket对比http

概念介绍:

     WebSocket是Web服务器的一个组件,WebSocket是一种基于TCP的新的网络传输协议,它实现了浏览器与服务器全双工通信——浏览器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

深度理解:

     前端发送请求建立连接,服务器接收到连接请求,与前端建立连接(基于WebSocket),前端发送请求到服务器,服务器给出响应,连接不会关闭,如果前端再次发送请求,服务器正常处理,直到这次连接关闭。

应用场景:

     例如 视频弹幕,网页聊天,浏览器的实时动态。

对比HTTP协议:⭐

WebSocket入门案例:⭐

     实现步骤:

  • 资源准备:有html页面作为客户端
  • 服务器端导入WebSocket的maven坐标
  • 导入WebSocket的服务器组件
  • 导入配置类,注册WebSocket的服务端组件
  • 注册一个定时任务类,用于测试。

     分析:

WebSocketServer是接收响应前端请求的,相当于SpringMVC中的Controller。

前端代码:

<!DOCTYPE HTML><html><head>    <meta charset="UTF-8">    <title>WebSocket Demo</title></head><body>    <input id="text" type="text" />    <button onclick="send()">发送消息</button>    <button onclick="closeWebSocket()">关闭连接</button>    <div id="message">    </div></body><script type="text/javascript">    var websocket = null;    var clientId = Math.random().toString(36).substr(2);     //判断当前浏览器是否支持WebSocket    if('WebSocket' in window){        //连接WebSocket节点        websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);    }    else{        alert('Not support websocket')    }     //连接发生错误的回调方法    websocket.onerror = function(){        setMessageInnerHTML("error");    };     //连接成功建立的回调方法    websocket.onopen = function(){        setMessageInnerHTML("连接成功");    }     //接收到消息的回调方法    websocket.onmessage = function(event){        setMessageInnerHTML(event.data);    }     //连接关闭的回调方法    websocket.onclose = function(){        setMessageInnerHTML("close");    }     //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。    window.onbeforeunload = function(){        websocket.close();    }     //将消息显示在网页上    function setMessageInnerHTML(innerHTML){        document.getElementById('message').innerHTML += innerHTML + '<br/>';    }     //发送消息    function send(){        var message = document.getElementById('text').value;        websocket.send(message);    }    //关闭连接    function closeWebSocket() {        websocket.close();    }</script></html>

导入maven坐标

        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>            <scope>compile</scope>        </dependency>

导入WebSocketServer代码:

@Component@ServerEndpoint("/ws/{sid}")public class WebSocketServer {     //存放会话对象    private static Map<String, Session> sessionMap = new HashMap();     /**     * 连接建立成功调用的方法     */    @OnOpen    public void onOpen(Session session, @PathParam("sid") String sid) {        System.out.println("客户端:" + sid + "建立连接");        sessionMap.put(sid, session);    }     /**     * 收到客户端消息后调用的方法     *     * @param message 客户端发送过来的消息     */    @OnMessage    public void onMessage(String message, @PathParam("sid") String sid) {        System.out.println("收到来自客户端:" + sid + "的信息:" + message);    }     /**     * 连接关闭调用的方法     *     * @param sid     */    @OnClose    public void onClose(@PathParam("sid") String sid) {        System.out.println("连接断开:" + sid);        sessionMap.remove(sid);    }     /**     * 群发     *     * @param message     */    public void sendToAllClient(String message) {        Collection<Session> sessions = sessionMap.values();        for (Session session : sessions) {            try {                //服务器向客户端发送消息                session.getBasicRemote().sendText(message);            } catch (Exception e) {                e.printStackTrace();            }        }    } }

导入WebSocketConfiguration代码:

@Configurationpublic class WebSocketConfiguration {     @Bean    public ServerEndpointExporter serverEndpointExporter() {        return new ServerEndpointExporter();    } }

导入TASK代码:

@Componentpublic class WebSocketTask {    @Autowired    private WebSocketServer webSocketServer;     /**     * 通过WebSocket每隔5秒向客户端发送消息     */    @Scheduled(cron = "0/5 * * * * ?")    public void sendMessageToClient() {        webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));    }}

测试:

相关文章
|
4月前
|
设计模式JavaSpring
【Spring源码】WebSocket做推送动作的底层实例是谁
我们都知道WebSocket可以主动推送消息给用户,那做推送动作的底层实例究竟是谁?我们先整体看下整个模块的组织机构。可以看到handleMessage方法定义了每个消息格式采用不同的消息处理方法,而这些方法该类并**没有实现**,而是留给了子类去实现。
【Spring源码】WebSocket做推送动作的底层实例是谁
|
2月前
|
前端开发网络协议JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
23天前
|
安全Java网络安全
当网络安全成为数字生活的守护者:Spring Security,为您的应用筑起坚不可摧的防线
【9月更文挑战第2天】在数字化时代,网络安全至关重要。本文通过在线银行应用案例,详细介绍了Spring Security这一Java核心安全框架的核心功能及其配置方法。从身份验证、授权控制到防御常见攻击,Spring Security提供了全面的解决方案,确保应用安全。通过示例代码展示了如何配置`WebSecurityConfigurerAdapter`及`HttpSecurity`,帮助开发者有效保护应用免受安全威胁。
|
27天前
|
JavaAPIUED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
|
21天前
|
JavaScript前端开发Java
【颠覆传统】Spring框架如何用WebSocket技术重塑实时通信格局?揭秘背后的故事与技术细节!
【9月更文挑战第4天】随着Web应用对实时交互需求的增长,传统的HTTP模型已无法满足现代应用的要求,特别是在需要持续、双向通信的场景下。WebSocket协议由此诞生,提供全双工通信渠道,使服务器与客户端能实时互发消息。作为Java开发中最受欢迎的框架之一,Spring通过其WebSocket模块支持这一协议,简化了WebSocket在Spring应用中的集成。
|
1月前
|
缓存NoSQLJava
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
|
1月前
|
JavaScript前端开发网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
|
3月前
|
前端开发JavaScript安全
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
7444
|
2月前
|
监控网络协议Java
如何在Spring Boot中使用WebSocket
如何在Spring Boot中使用WebSocket
|
2月前
|
监控前端开发网络协议
如何使用Spring Boot实现WebSocket通信
如何使用Spring Boot实现WebSocket通信

热门文章

最新文章