当前位置: 首页 > 知识库问答 >
问题:

WebSocketSession。send什么也不做

江奕
2023-03-14

我正在编写一个游戏,当一个玩家结束回合时,我想通知对手轮到他玩了。

所以我在“播放器”类中存储了WebSocket会话,所以我只需要得到一个播放器的实例来访问他的WebSocket会话。

问题是,当我使用存储在“player”实例中的websocketsession的“send”方法时,什么都没有发生。

下面是我将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);
}
}

您可以在屏幕截图上看到句柄方法正常工作,我能够发送和接收消息。WebSocket输入和输出

有人知道我怎样才能提出反对意见吗。send方法工作正常,以便我可以在前端接收消息?

共有1个答案

吕皓
2023-03-14

您正在为您的websocket和websocket会话使用Reactor栈#发送并返回一个Mono

在您的endpoint中,它看起来不像您正在使用webflux,所以您处于同步世界中,所以除了block

opponentSession.send(Mono.just(webSocketMessage)).block();

如果您使用的是网络流量,那么您应该更改您的方法以返回单声道,并执行以下操作:

return opponentSession.send(Mono.just(webSocketMessage)).then(gameService.getGameStateByAccount(account));

如果您不熟悉这一点,您应该查看projectreactor和WebFlux

 类似资料:
  • 描述 (Description) 此函数在SOCKET上发送消息(与recv相反)。 如果套接字未连接,则必须提供与TO参数进行通信的目标。 在这种情况下,使用sendto系统功能代替系统发送功能。 FLAGS参数由按位或0以及一个或多个MSG_OOB和MSG_DONTROUTE选项组成。 MSG_OOB允许您在支持此概念的套接字上发送带外数据。 底层协议还必须支持带外数据。 只有AF_INET地

  • send(经socket传送数据) 相关函数 sendto,sendmsg,recv,recvfrom,socket 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int send(int s,const void * msg,int len,unsigned int falgs); 函数说明 send()用来将数据由指定的socke

  • 此函数用于将值发送到代理。 语法 (Syntax) 以下是语法。 (send agentname function value) Parameters - 'agentname'是将send函数重定向到的代理程序。 'function'用于确定代理的值将以何种方式更改。 在我们的例子中,我们将使用加号+符号将值添加到代理的现有值。 'Value'是传递给函数的值,而后者又将用于相应地更新代理的值

  • send 经socket传送数据 相关函数 sendto,sendmsg,recv,recvfrom,socket 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int send(int s, const void *msg, int len, unsigned int flags); 函数说明 send()用来将数据由指定的so

  • 我是结点和快递新手,见过app.getapp.post例子同时使用“res.send”和“res.send”,这些是一样的吗? 或者

  • 什么会导致套接字命令上的错误?套接字设置为。它大部分时间都在工作,但偶尔会得到这个错误。插座的接收端似乎工作正常。 我知道这不是很详细,但我只是在寻找大致的想法。谢了!