我正在编写一个游戏,当一个玩家结束回合时,我想通知对手轮到他玩了。
所以我在“播放器”类中存储了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方法工作正常,以便我可以在前端接收消息?
您正在为您的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”,这些是一样的吗? 或者
什么会导致套接字命令上的错误?套接字设置为。它大部分时间都在工作,但偶尔会得到这个错误。插座的接收端似乎工作正常。 我知道这不是很详细,但我只是在寻找大致的想法。谢了!