【发布时间】:2021-12-30 12:59:39
【问题描述】:
我正在编写一个游戏,当一个玩家结束其回合时,我想通知对手轮到他玩了。
所以我将 WebSocketSessions 存储在“Player”类中,所以我只需要获取一个玩家的实例就可以访问他的 websocketsession。
问题是当我使用存储在“播放器”实例中的 websocketsession 的“发送”方法时,什么都没有发生。
这是我将 WebSocketSession 存储在播放器对象中的代码,它实际上从前端正确接收消息,并且能够发回消息并且它可以工作:
@Component("ReactiveWebSocketHandler")
public class ReactiveWebSocketHandler implements WebSocketHandler {
@Autowired
private AuthenticationService authenticationService;
@Override
public Mono<Void> handle(WebSocketSession webSocketSession) {
Flux<WebSocketMessage> output = webSocketSession.receive()
.map(msg -> {
String payloadAsText = msg.getPayloadAsText();
Account account = authenticationService.getAccountByToken(payloadAsText);
Games.getInstance().getGames().get(account.getIdCurrentGame()).getPlayerById(account.getId()).setSession(webSocketSession);
return "WebSocketSession id: " + webSocketSession.getId();
})
.map(webSocketSession::textMessage);
return webSocketSession
.send(output);
}
}
这是我用来通知对手玩家轮到该玩的代码了,“opponentSession.send”方法似乎没有产生任何结果,没有错误消息,看起来我什么也没收到前端。会话的 ID 与 handle 方法中的相同,所以我认为会话对象很好,当我进行测试时,websocket 会话也已打开并准备就绪:
@RequestMapping(value = "/game/endTurn", method = RequestMethod.POST)
GameBean endTurn(
@RequestHeader(value = "token", required = true) String token) {
ObjectMapper mapper = new ObjectMapper();
Account account = authenticationService.getAccountByToken(token);
gameService.endTurn(account);
Game game = gameService.getGameByAccount(account);
//GameBean opponentGameBean = game.getOpponentGameState(account.getId());
//WebSocketMessage webSocketMessage = opponentSession.textMessage(mapper.writeValueAsString(opponentGameBean));
WebSocketSession opponentSession = game.getPlayerById(game.getOpponentId(account.getId())).getSession();
WebSocketMessage webSocketMessage = opponentSession.textMessage("test message");
opponentSession.send(Mono.just(webSocketMessage));
return gameService.getGameStateByAccount(account);
}
}
您可以在屏幕截图中看到,handle 方法工作正常,我可以发送和接收消息。 Websocket input and output
有人知道我怎样才能让对手Session.send 方法正常工作,以便我可以在前端接收消息吗?
【问题讨论】:
-
你不应该混合使用 webflux 和 spring web。如果这样做,spring 服务器将启动一个 spring web 应用程序,而您将无法从响应式应用程序中获得好处。
标签: java websocket spring-webflux