java - 向 WebSocketHandlerRegistry 添加多个处理程序
问题描述
我想用相同的路径TextWebSocketHandler
添加和BinaryWebSocketHandler
注册(首先是)。问题是当我尝试发送. 服务器以 status 关闭会话,但工作正常TextWebSocketHandler
TextMessage
statusCloseStatus[code=1003, reason=Text messages not supported]
BinaryMessage
我试图handleBinaryMessage
在TextMessage
类中覆盖并且它有效,但我认为添加多个适当的处理程序会更好。
这是代码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);
}
}, "/");
}
}
解决方案
推荐阅读
- c# - 如何检查数值是否为零
- c - 如何从 .txt 文件中读取已知数量的未知大小的字符串并将每一行存储在矩阵的一行中(在 C 中)?
- c# - 旋转时控制混乱
- python - Pandas Dataframe 用 stack 和 unstack 重塑
- php - laravel 部分破坏了 flowe 的其余部分
- javascript - AngularJS:ng-repeat 检测组更改
- java - 从 Vert.x 调用多个呼出电话
- java - 用于测试 RabbitMQ 消费者和生产者的 JUnit 测试
- html - 边距正在移动父容器和子 div 而不仅仅是子 div
- reactjs - react native redux dispatch outside component is not trigger componentWillReceiveProps