首页 > 解决方案 > 向 WebSocketHandlerRegistry 添加多个处理程序

问题描述

我想用相同的路径TextWebSocketHandler添加和BinaryWebSocketHandler注册(首先是)。问题是当我尝试发送. 服务器以 status 关闭会话,但工作正常TextWebSocketHandlerTextMessagestatusCloseStatus[code=1003, reason=Text messages not supported]BinaryMessage

我试图handleBinaryMessageTextMessage类中覆盖并且它有效,但我认为添加多个适当的处理程序会更好。

这是代码WebSocketConfigurer

package block.app;

import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.BinaryWebSocketHandler;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@Configuration
@EnableWebSocket
public class P2PServer implements WebSocketConfigurer
{
    private final List<WebSocketSession> sessions=new CopyOnWriteArrayList<>();

    private void afterConnectionEstablished(@NotNull final WebSocketSession session)
    {
        System.out.println("Connection with id "+session.getId()+" established!!!");
        sessions.add(session);
    }

    private void handleTextMessage(@NotNull final WebSocketSession session,
                                   @NotNull final TextMessage message) throws IOException
    {
        System.out.println("Broadcasting "+message+" to "+sessions.size()+" sessions!!!");
        for (WebSocketSession session1 : sessions)
            session1.sendMessage(message);
    }

    private void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws IOException
    {
        System.out.println("Broadcasting "+message+" to "+sessions.size()+" sessions!!!");
        for (WebSocketSession session1 : sessions)
            session1.sendMessage(message);
    }

    private void afterConnectionClosed(@NotNull final WebSocketSession session,
                                       @NotNull final CloseStatus status)
    {
        System.out.println("Connection with id "+session.getId()+" closed with status "+status+"!!!");
        sessions.remove(session);
    }

    @Override
    public void registerWebSocketHandlers(@NotNull final WebSocketHandlerRegistry registry)
    {
        registry.addHandler(new TextWebSocketHandler()
        {
            @Override
            public void afterConnectionEstablished(@NotNull final WebSocketSession session)
            {
                P2PServer.this.afterConnectionEstablished(session);
            }

            @Override
            protected void handleTextMessage(@NotNull final WebSocketSession session,
                                             @NotNull final TextMessage message) throws IOException
            {
                P2PServer.this.handleTextMessage(session, message);
            }

            @Override
            public void afterConnectionClosed(@NotNull final WebSocketSession session,
                                              @NotNull final CloseStatus status)
            {
                P2PServer.this.afterConnectionClosed(session, status);
            }
        }, "/");
        registry.addHandler(new BinaryWebSocketHandler()
        {
            @Override
            public void afterConnectionEstablished(@NotNull final WebSocketSession session)
            {
                P2PServer.this.afterConnectionEstablished(session);
            }

            @Override
            protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws IOException
            {
                P2PServer.this.handleBinaryMessage(session, message);
            }

            @Override
            public void afterConnectionClosed(@NotNull final WebSocketSession session,
                                              @NotNull final CloseStatus status)
            {
                P2PServer.this.afterConnectionClosed(session, status);
            }
        }, "/");
    }
}

标签: javaspring-bootspring-websocket

解决方案


推荐阅读