webSocket介绍与使用 spring boot 集成 websocket教程 java

目录

一、WebSocket简介

二、WebSocket优缺点

三、spring boot集成webSocket

四、验证


一、WebSocket简介

        WebSocket建立在TCP协议上,是一种在单个TCP连接上进行全双工通信的协议。

        HTML5里面提出了WebSocket标准,目的是让服务器具有“主送”向浏览器推送信息的能力,它允许客户端和服务器之间建立持久连接,实现实时的数据传输功能。

WebSocket通讯分为两个阶段:

1.握手阶段

        客户端通过HTTP请求发起握手请求,请求头包含一些特殊字段,如pgrade:websocket和Connection:Upgrade以及其他的WebSocket相关字段。

服务器收到客户端的WebSocket握手请求后,进行协议升级,将HTTP升级为WebSocket连接。服务器返回一个WebSocket握手响应,相应头中包如:Upgrade:websocket和Connection:Upgrade等WebSocket相关字段。

客户端收到服务器的WebSocket握手响应后,WebSocket连接就建立成功,客户端和服务端都可以发送和接收WebSocket消息。

2.数据交换阶段

        WebSocket建立成功后,客户端和服务器都可以通过WebSocket会话进行实时的双向数据交换。同时,客户端和服务端可以通过发送心跳数据帧来维持连接,如果在一段时间内没有收到心跳响应,则断开WebSocket连接。

二、WebSocket优缺点

1.优点

        支持双向通讯,实时性比较高,更加灵活。

        开销少,ws建立成功后,客户端、服务端进行数据交换,协议控制的数据包头部较小。http需要完整的头部信息。

        可扩展,WebSocket协议定义了扩展,用户可以扩展协议。

2.缺点

        服务端需要支持WebSocket协议。

        客户端连接数多,服务端压力大。

三、spring boot集成webSocket

1.新建spring boot项目,再pom.xml加入以下配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.18.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- webSocket依赖包 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
</dependencies>

2.再spring boot启动类开启websocket功能

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.socket.config.annotation.EnableWebSocket;

//开启WebSocket
@EnableWebSocket
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

3.新建WebSoketConfig配置类

package com.example.demo.common.config.websocket;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置类
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

4.新建WebSocketServer服务类

package com.example.demo.common.config.websocket;

import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ServerEndpoint:该注解用于暴漏外部ws的路径,类似@RequestMapping注解。例如服务端口8080,请求地址:ws://localhost:8080/myWs
 * 路径上{userId}  可在onOpen连接成功方法使用@PathParam("userId") String userId接收数据
 */
@ServerEndpoint("/myWs/{userId}")
@Component
public class WebSocketServer {
    //线程安全的map,用来保存每个客户端对应的WebSocket对象
    private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
    //单个客户端的session,通过session与对应客户端通讯
    private Session session;
    //用户id
    private String userId;

    /**
     * 连接成功
     * @OnOpen注解:websocket 连接成功后,触发该注解修饰的方法
     * @param session
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.session = session;
        this.userId = userId;
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            webSocketMap.put(userId, this);
        } else {
            webSocketMap.put(userId, this);
        }
        System.out.println("连接成功");
    }

    /**
     * 连接关闭
     * @OnClose注解:websocket断开连接后,触发该注解修饰的方法
     * @param session
     */
    @OnClose
    public void onCLose(Session session) {
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
        }
        System.out.println("关闭连接");
    }

    /**
     * 接收消息
     * @OnMessage注解:客户端发送消息时,触发该注解声明的方法
     * @param text
     * @return
     */
    @OnMessage
    public void onMessage(String text) {
        System.out.println("后端接收前端web发送数据userId:" + userId + ",接收信息:" + text);
        if (webSocketMap.containsKey(userId)) {
            try {
                webSocketMap.get(userId).session.getBasicRemote().sendText("返回web数据userId:" + userId + ",返回消息:" + text);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 连接异常
     * @OnError注解:当建立的连接出现异常后,触发该注解修饰的方法
     * @param session
     * @param throwable
     */
    @OnError
    public void onError(Session session, Throwable throwable) {
        System.out.println("websocket连接异常:" + throwable.getMessage());
    }

    /**
     * 服务器给指定WebSocket客户端发送信息
     * @param userId
     * @param message
     */
    public static void sendInfo(String userId, String message) {
        System.out.println("后端发送前端web数据userId:" + userId + "发送消息:" + message);
        if (webSocketMap.containsKey(userId)) {
            try {
                webSocketMap.get(userId).session.getBasicRemote().sendText("后端发送前端web数据userId" + userId + ",内容:" + message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

5.新建DemoController测试类,增加接口通过webSocket给客户端发信信息

package com.example.demo.controller;

import com.example.demo.common.config.websocket.WebSocketServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @RequestMapping("/demo")
    public boolean demo(@RequestParam("userId") String userId, @RequestParam("message") String mesage) {
        //给前端web推送数据
        WebSocketServer.sendInfo(userId, mesage);
        return true;
    }
}

四、验证

1.启动服务,访问websocket在线测试页面,与后端建立连接

2.后端显示连接成功

3.通过websocket给后端发送数据

4.后端打印接收到的数据

5.调用后端接口,通过websocket给前端推送数据

6.websocket在线测试页面收到数据

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 使用Java Spring BootWebSocket程序,可以使用如下步骤: 1. 创建一个Spring Boot项目,选择Web和Websocket模块; 2. 在项目中配置WebSocket服务器,这可以通过实现WebSocketConfigurer接口并重写registerWebSocketHandlers方法来完成; 3. 创建一个WebSocket消息处理类,实现WebSocketHandler接口,并重写其中的方法来处理WebSocket消息; 4. 在页面上使用JavaScript代码连接WebSocket服务器并发送和接收消息。 以上就是使用Java Spring Boot编写WebSocket程序的基本流程。具体实现过程中可能会有一些细节需要注意,请参考相关文档或教程。 ### 回答2: 使用Java Spring Boot编写WebSocket是一种实现实时双向通信的常见方式。下面简要介绍一下如何使用Java Spring Boot编写WebSocket: 1. 首先,确保已经添加了Spring BootWebSocket依赖项。这可以通过在Maven或Gradle配置文件中添加相应的依赖项来实现。 2. 创建一个WebSocket配置类。在此类中,使用@EnableWebSocket注解启用WebSocket,并继承WebSocketConfigurer接口。重写registerWebSocketHandlers方法,创建并配置WebSocket处理器和WebSocket拦截器。 3. 创建一个WebSocket处理器类。在此类中,扩展TextWebSocketHandler类,并重写handleTextMessage方法以处理客户端发送的消息。您可以在此方法中编写自定义逻辑以处理消息。 4. 在WebSocket配置类中,使用addHandler方法将WebSocket处理器添加为WebSocket的处理程序,并指定WebSocket的端点。可以通过重写configureMessageBroker方法来配置消息代理(可选)。 5. 在控制器或服务类中,使用@MessageMapping和@SendTo注解定义处理WebSocket消息的方法。在处理方法中,您可以处理传入的消息并返回要发送给客户端的消息。 6. 在前端页面中,使用JavaScript编写WebSocket客户端代码。使用WebSocket对象连接到WebSocket服务器,并通过send方法发送消息。您可以使用onmessage事件处理器处理从服务器接收到的消息。 7. 运行应用程序并通过浏览器访问前端页面。您将能够使用WebSocket与服务器进行实时双向通信。 这是一个基本的步骤和结构,用于使用Java Spring Boot编写WebSocket。根据您的需求,您可以根据自己的需求进行扩展和自定义。 ### 回答3: 使用Java Spring Boot编写WebSocket可以按照以下步骤进行: 1. 创建一个新的Spring Boot项目,并添加相关依赖。在pom.xml文件中添加spring-boot-starter-websocket依赖: ```xml <dependencies> <!-- 其他依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> ``` 2. 创建一个WebSocket处理器类,在该类中处理WebSocket的连接、消息发送和接收等操作。可以使用@Component注解将其作为一个Spring Bean进行管理。例如: ```java import org.springframework.stereotype.Component; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; @Component public class MyWebSocketHandler extends TextWebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // WebSocket连接建立后的操作 // 可以在此保存会话信息,如将该会话加入到某个会话列表中 } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 接收到WebSocket消息的操作 // 可以在此处理接收到的消息,并根据需要进行回复 String receivedMessage = message.getPayload(); // 处理消息并回复 session.sendMessage(new TextMessage("Received: " + receivedMessage)); } // 其他WebSocket操作的重写方法 } ``` 3. 创建一个WebSocket配置类,配置WebSocket的端点以及WebSocket处理器。可以使用@EnableWebSocket注解开启WebSocket支持,并重写registerWebSocketHandlers方法配置WebSocket处理器和端点。例如: ```java import org.springframework.context.annotation.Configuration; 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(new MyWebSocketHandler(), "/websocket") .setAllowedOrigins("*"); // 允许跨域访问 } } ``` 4. 启动Spring Boot应用程序,WebSocket将注册/websocket端点以供客户端连接。客户端可以使用浏览器的WebSocket API或其他WebSocket客户端与服务器建立连接,并发送和接收WebSocket消息。 以上就是使用Java Spring Boot编写WebSocket的基本步骤,根据需要可以进一步修改和扩展WebSocket处理器以满足具体的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天道酬勤-L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值