使用SpringBoot搭建WebSocket服务

1、springboot环境

使用SpringBoot搭建WebSocket服务_第1张图片

2、加入websocket依赖

使用SpringBoot搭建WebSocket服务_第2张图片

3、加入websocket配置类

使用SpringBoot搭建WebSocket服务_第3张图片

4、添加websocket响应事件处理

ServerEndpoint(value = "/websocket/test/{sid}")
@Component
@Slf4j
public class WebSocketServer {
    /**
     * 每个客户端对应的WebSocket对象
     */
    public static Map<String, Session> clientMap = new ConcurrentHashMap<>();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        clientMap.put(sid, session);

        log.info("有一个新的客户端 : " + sid + " , 当前客户端连接总数: " + clientMap.size());
        try {
            WebScoketHelper.sendMessage(session, "你好,新客户端!sid = " + sid);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        clientMap.remove(sid);
        log.info("有一个客户端断开,当前客户端连接总数: " + clientMap.size());
    }

    /**
     * 收到客户端消息
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
    	log.info("接收到客户端消息, " + sid +" , message: " + message);
    }

	/**
	 * 
	 * @param session
	 * @param error
	 */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("出错了!");
        error.printStackTrace();
    }

}

WebSocketHelper代码:

@Slf4j
public class WebScoketHelper {

    /**
     * 推送文本消息给指定的客户端
     */
    public static void sendMessage(Session sess, String message) throws IOException {
        sess.getBasicRemote().sendText(message);
    }

    /**
     * 推送对象给指定的客户端
     * @param sess:
     * @param object:
     */
    public static void sendObject(Session sess, Object object) throws IOException, EncodeException {
            sess.getBasicRemote().sendObject(object);
    }

    /**
     * 推送文本给所有的客户端
     */
    public static void sendTextToAll(Collection<Session> sessionList, String message) {

        sessionList.forEach(e -> {
            try {
                sendMessage(e, message);
            } catch (IOException e1 ) {
                throw new RuntimeException("推送失败,session.id=" + e.getId(), e1);
            }
        });
    }

    /**
     * 推送文本给所有的客户端
     */
    public static void sendObjectToAll(Collection<Session> sessionList, String message) {

        sessionList.forEach(e -> {
            try {
                sendObject(e, message);
            } catch (IOException | EncodeException e1) {
                throw new RuntimeException("推送失败,session.id=" + e.getId(), e1);
            }
        });
    }

5、页面js处理代码

  //websocket握手
    var socket;
    if(typeof(WebSocket) == "undefined") {
        console.log("Your browser is not support WebSocket!");
    }else{
        console.log("Your browser is ok for WebSocket!");

        //建立连接
        socket = new WebSocket("ws://localhost:18080/websocket/test/123");
        socket.onopen = function() {
            console.log("Socket is open!");
        };

        //获得消息事件
        socket.onmessage = function(msg) {        
            console.log("浏览器推来消息:" + msg.data);
            
        };

        //关闭事件
        socket.onclose = function() {
            console.log("Socket 关闭了!");
        };

        //发生了错误事件
        socket.onerror = function() {
            alert("Socket 出错了!");
        }

    }

此时,websocket服务已基本开发成功,打开浏览器,输入:http://localhost:18080/,查看浏览器控制台:使用SpringBoot搭建WebSocket服务_第4张图片
打开postman, 发送请求:http://localhost:18080/send, 结果如下图:使用SpringBoot搭建WebSocket服务_第5张图片
至此,websocket测试成功!

6、编码

上面的websocket服务,推送文本、字符串是正常了,但是推送对象会报错。如下:使用SpringBoot搭建WebSocket服务_第6张图片
提示很明确,没有定义编码器,下面我们来自定义一个编码器。

public class ObjectMessageEncoder implements Encoder.Text<Object> {

    @Override
    public String encode(Object message) throws EncodeException {
        try {
            return mapper.writeValueAsString(message);
        } catch (JsonProcessingException e) {
            throw new EncodeException(e, "encode faliure!");
        }
    }

    @Override
    public void init(EndpointConfig endpointConfig) {

    }

    @Override
    public void destroy() {

    }

    protected static ObjectMapper mapper = new ObjectMapper();
}

配置编码器,在服务代码上修改:
使用SpringBoot搭建WebSocket服务_第7张图片
再次测试发送对象,已经正常推送了。

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