springboot websocket简单入门示例

 更新时间:2018年08月15日 10:04:49   作者:王强劲  
这篇文章主要介绍了springboot websocket简单入门示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

之前做的需求都是客户端请求服务器响应,新需求是服务器主动推送信息到客户端.百度之后有流、长轮询、websoket等方式进行.但是目前更加推崇且合理的显然是websocket.

从springboot官网翻译了一些资料,再加上百度简单实现了springboot使用websocekt与客户端的双工通信.

1.首先搭建一个简单的springboot环境

<!-- Inherit defaults from Spring Boot -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
  </parent>

  <!-- Add typical dependencies for a web application -->
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

2.引入springboot整合websocket依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
  <version>2.0.4.RELEASE</version>
</dependency>

3.创建启动springboot的核心类

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

4.创建websocket服务器

正如springboot 官网推荐的websocket案例,需要实现WebSocketHandler或者继承TextWebSocketHandler/BinaryWebSocketHandler当中的任意一个.

package com.xiaoer.handler;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.util.HashMap;
import java.util.Map;

/**
 * 相当于controller的处理器
 */
public class MyHandler extends TextWebSocketHandler {
  @Override
  protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    String payload = message.getPayload();
    Map<String, String> map = JSONObject.parseObject(payload, HashMap.class);
    System.out.println("=====接受到的数据"+map);
    session.sendMessage(new TextMessage("服务器返回收到的信息," + payload));
  }
}

5.注册处理器

package com.xiaoer.config;

import com.xiaoer.handler.MyHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(myHandler(), "myHandler/{ID}");
  }
  public WebSocketHandler myHandler() {
    return new MyHandler();
  }

}

6.运行访问


出现如上图是因为不能直接通过http协议访问,需要通过html5的ws://协议进行访问.

7.创建Html5 客户端

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <input id="text" type="text" />
    <button onclick="send()">Send</button>  
    <button onclick="closeWebSocket()">Close</button>
    <div id="message">
    </div>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script>
      
      var userID="888";
      var websocket=null;

      $(function(){
        connectWebSocket();
      })
      
      //建立WebSocket连接
      function connectWebSocket(){

        console.log("开始...");
       
       //建立webSocket连接
        websocket = new WebSocket("ws://127.0.0.1:8080/myHandler/ID="+userID);
       
       //打开webSokcet连接时,回调该函数
        websocket.onopen = function () {   
          console.log("onpen"); 
        }
        
        //关闭webSocket连接时,回调该函数
        websocket.onclose = function () {
        //关闭连接  
          console.log("onclose");
        }

        //接收信息
        websocket.onmessage = function (msg) {
          console.log(msg.data);
        }

      }
      //发送消息
      function send(){
        var postValue={};
        postValue.id=userID;
        postValue.message=$("#text").val();     
        websocket.send(JSON.stringify(postValue));
      }
      //关闭连接
      function closeWebSocket(){
        if(websocket != null) {
          websocket.close();
        }
      }
    </script>
  </body>
</html>

8.运行


利用客户端运行之后仍然会出现上图中的一连接就中断了websocket连接.

这是因为spring默认不接受跨域访问:

As of Spring Framework 4.1.5, the default behavior for WebSocket and SockJS is to accept only same origin requests.

需要在WebSocketConfig中设置setAllowedOrigins.

package com.xiaoer.config;

import com.xiaoer.handler.MyHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(myHandler(), "myHandler/{ID}")
      .setAllowedOrigins("*");
  }
  public WebSocketHandler myHandler() {
    return new MyHandler();
  }

}

如下图,并未输出中断,说明连接成功.

9.服务器和客户端的相互通信

服务器端收到消息


客户端收到服务器主动推送消息

以上就是一个最基础的springboot简单应用.还可以通过拦截器、重写WebSocketConfigurer中的方法进行更为复杂的属性操作.具体可以参考SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送

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

相关文章

  • struts1之ActionServlet详解_动力节点Java学院整理

    struts1之ActionServlet详解_动力节点Java学院整理

    这篇文章主要介绍了struts1之ActionServlet详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java 反射机制的实例详解

    Java 反射机制的实例详解

    这篇文章主要介绍了Java 反射机制的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握反射机制,需要的朋友可以参考下
    2017-10-10
  • MyBatis中的collection两种使用方法及效率比较

    MyBatis中的collection两种使用方法及效率比较

    collection主要是应对表关系是一对多的情况,本文主要介绍了MyBatis中的collection两种使用方法及效率比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • IDEA的Mybatis Log Plugin插件配置和使用详解

    IDEA的Mybatis Log Plugin插件配置和使用详解

    这篇文章主要介绍了IDEA的Mybatis Log Plugin插件配置和使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringMVC @RequestBody 为null问题的排查及解决

    SpringMVC @RequestBody 为null问题的排查及解决

    这篇文章主要介绍了SpringMVC @RequestBody 为null问题的排查及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java复杂链表的复制详解

    Java复杂链表的复制详解

    复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点,我们来探究一下在Java中复杂链表的复制
    2022-01-01
  • MyBatis-Plus动态表名使用selectPage方法不生效问题解析与解决方案

    MyBatis-Plus动态表名使用selectPage方法不生效问题解析与解决方案

    MyBatis-Plus是MyBatis的增强工具,动态表名是MyBatis-Plus的一个重要功能之一,一些开发者在使用selectPage方法时可能会遇到动态表名不生效的问题,本文将深入分析这个问题的原因,并提供相应的解决方案,需要的朋友可以参考下
    2023-12-12
  • 解析JAVA深度克隆与浅度克隆的区别详解

    解析JAVA深度克隆与浅度克隆的区别详解

    本篇文章是对JAVA深度克隆与浅度克隆的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java基础之序列化与反序列化详解

    Java基础之序列化与反序列化详解

    这篇文章主要介绍了Java基础之序列化与反序列化详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java飞行记录器JFR功能实现过程图解

    Java飞行记录器JFR功能实现过程图解

    这篇文章主要介绍了Java飞行记录器JFR功能实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论