springboot 下 websocket 使用

本贴最后更新于 585 天前,其中的信息可能已经物是人非
  1. 添加依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 添加 MyWebSocket 类
package com.jfsoft.socket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author ChenXc
 * @version V1.0
 * @Date 2018/10/8  15:07
 * @Description TODO(一句话描述类作用)
  */
@ServerEndpoint(value = "/websocket") //接受websocket请求路径
@Component //注册到spring容器中
public class MyWebSocket {

    //保存所有在线socket连接
  private static Map, MyWebSocket> webSocketMap = new LinkedHashMap<>();

  //记录当前在线数目
  private static int count = 0;

  //当前连接(每个websocket连入都会创建一个MyWebSocket实例
  private Session session;

 private Logger log = LoggerFactory.getLogger(this.getClass());

  //处理连接建立
  @OnOpen
  public void onOpen(Session session) {
        this.session = session;
  webSocketMap.put(session.getId(), this);
  addCount();
  log.info("新的连接加入:{}", session.getId());
  }

    //接受消息
  @OnMessage
  public void onMessage(String message, Session session) {
        log.info("收到客户端{}消息:{}", session.getId(), message);
 try {
            this.sendMessage("收到消息:" + message);
  } catch (Exception e) {
            e.printStackTrace();
  }
    }

    //处理错误
  @OnError
  public void onError(Throwable error, Session session) {
        log.info("发生错误{},{}", session.getId(), error.getMessage());
  }

    //处理连接关闭
  @OnClose
  public void onClose() {
        webSocketMap.remove(this.session.getId());
  reduceCount();
  log.info("连接关闭:{}", this.session.getId());
  }

    //群发消息

  //发送消息
  public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
  }

    //广播消息
  public static void broadcast(String msg) {
        MyWebSocket.webSocketMap.forEach((k, v) -> {
            try {
                v.sendMessage(msg);
  } catch (Exception e) {
            }
        });
  }

    //获取在线连接数目
  public static int getCount() {
        return count;
  }

    //操作count,使用synchronized确保线程安全
  public static synchronized void addCount() {
        MyWebSocket.count++;
  }

    public static synchronized void reduceCount() {
        MyWebSocket.count--;
  }
}
  1. 添加 WebSocketConfig 类
package com.jfsoft.socket;

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

/**
 * @author ChenXc
 * @version V1.0
 * @Date 2018/10/8  15:06
 * @Description TODO(一句话描述类作用)
  */
@Configuration
public class WebSocketConfig {

    @Bean
  public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
  }
}
  1. 添加测试页面 test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>websocket测试</h1>
</body>
<script>
    let socket = new WebSocket("ws://localhost:8080/websocket");
    socket.onerror = err => {
        console.log(err);
    };
    socket.onopen = event => {
        console.log(event);
    };
    socket.onmessage = msg => {
        console.log(msg)
    };
    socket.onclose = () => {
        console.log("连接关闭");
    };

    function sendMessage() {
        if (socket.readyState === 1)
            socket.send("这是一个测试数据");
        else
            alert("尚未建立websocket连接");
    }
</script>
</html>

注意:SpringBoot 下 WebSocket 运行没问题,但是打包会报错,解决如下
TIM20181009124213png

  • Spring

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

    782 引用 • 1368 回帖 • 690 关注
  • WebSocket

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

    41 引用 • 156 回帖 • 630 关注

赞助商 我要投放

2 回帖
请输入回帖内容 ...
  • linker

    代码中有一段丢失了部分字符:
    private static Map, MyWebSocket> webSocketMap = new LinkedHashMap<>();

  • EvilCodes

    这个是网上现成的代码吧