个人学习系列 - WebSocket与Spring Boot整合

WebSocket 是一种网络通信协议。它与HTTP协议最大的不同在于,HTTP协议做不到服务器主动向客户端推送信息。

WebSocket

其最大的特点在于:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

Spring Boot项目搭建

前面的步骤就不再赘述了,我们直接从pom.xml里面添加的依赖开始吧。

1. pom.xml文件配置


    org.springframework.boot
    spring-boot-starter-thymeleaf



    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-websocket



    org.projectlombok
    lombok
    true

2. application.yml配置

server:
  port: 8888
spring:
  freemarker:
    prefix: classpath:/templates/
    suffix: .html

3. index.html页面




    WebSoket Demo
    


    

4. 控制层

/**
 * 测试控制器
 * @author zhouzhaodong
 */
@Controller
public class TestController {

    @RequestMapping("/")
    public String view(){
        return "index";
    }

}

5. WebSocket配置类

/**
 * WebSocket配置类
 * @author zhouzhaodong
 */
@Configuration
public class WebsocketConfiguration {

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

}

6. WebSocket服务端

/**
 * WebSocket服务端
 * @author zhouzhaodong
 */
@ServerEndpoint("/websocket")
@Component
@Slf4j
public class MyWebsocketServer {

    /**
     * 存放所有在线的客户端
     */
    private static final Map CLIENTS = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session) {
        log.info("有新的客户端连接了: {}", session.getId());
        //将新用户存入在线的组
        CLIENTS.put(session.getId(), session);
    }

    /**
     * 客户端关闭
     * @param session session
     */
    @OnClose
    public void onClose(Session session) {
        log.info("有用户断开了, id为:{}", session.getId());
        //将掉线的用户移除在线的组里
        CLIENTS.remove(session.getId());
    }

    /**
     * 发生错误
     * @param throwable e
     */
    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

    /**
     * 收到客户端发来消息
     * @param message  消息对象
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("服务端收到客户端发来的消息: {}", message);
        this.sendAll(message);
    }

    /**
     * 群发消息
     * @param message 消息内容
     */
    private void sendAll(String message) {
        for (Map.Entry sessionEntry : CLIENTS.entrySet()) {
            sessionEntry.getValue().getAsyncRemote().sendText(message);
        }
    }

}

7. 启动项目,访问http://localhost:8888/查看项目:

个人学习系列 - WebSocket与Spring Boot整合_第1张图片

输入信息,点击send按钮后就会发送信息啦。

后端控制台打印信息如下:
图片.png

程序源码地址:

https://github.com/zhouzhaodo...

个人博客:

http://www.zhouzhaodong.xyz

你可能感兴趣的:(websocket,springboot)