我有一个应用,其中多个人可以通过输入在托管游戏的手机上生成的代码来加入游戏。我想将此代码用作套接字io房间的名称,以便可以在不同组的玩家之间进行多个游戏。
这是我的服务器代码:
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(3000);
io.on('connection', function (socket) {
//passing in the game_code from client side and using it as the room name
socket.on('names', function (game_code) {
socket.join(game_code);
io.to(game_code).emit('names')
});
socket.on('round_start', function (game_code) {
io.to(game_code).emit('round_start')
});
socket.on('game_start', function (game_code) {
io.to(game_code).emit('game_start')
});
socket.on('end_round', function (game_code) {
io.to(game_code).emit('end_round')
});
socket.on('next_round', function (game_code) {
io.to(game_code).emit('next_round')
});
socket.on('end_game', function (game_code) {
io.to(game_code).emit('end_game')
});
});
“名称”套接字用于在游戏开始之前输入其名称的玩家,其余的用于过渡到下一个屏幕;一个电话(通常是主机)按下一个按钮,使所有电话进入下一屏幕。 “名称”套接字正常工作,“ round_start”套接字也正常工作,这是第一个屏幕转换。此后的下一个屏幕转换不起作用。
如果我不使用房间,所有的屏幕转换都可以正常工作,所以我很确定我的本机代码不是这里的问题。我上面显示的服务器代码一定有问题。
答案 0 :(得分:0)
由于您没有提供完整的源代码,所以我只能假设可能出了问题。
首先,因为我假设您使用过io.to(game_code).emit('names')
,所以您希望将“名称”事件发送给会议室game_code
中的所有客户端,包括发送者。
(旁注:如果希望将此事件发送给会议室中除发件人以外的所有用户,则应使用socket.to(game_code).emit('names')
。请参见https://socket.io/docs/emit-cheatsheet/)
但是,由于.join
方法是异步的,因此在客户端加入会议室之前,可能会触发'names'事件。因此,发件人永远不会收到自己触发的“名称”事件,而只会收到其他客户端触发的“名称”事件。
为确保在客户端加入会议室后触发“名称”事件,您可以对.join
方法使用回调:socket.join(room, callback)
。
io.on('connection', function (socket) {
//passing in the game_code from client side and using it as the room name
socket.on('names', function (game_code) {
socket.join(game_code, (game_code) => io.to(game_code).emit('names'););
});
//rest of your code
});
如果您不熟悉=>
箭头功能,(game_code) => io.to(game_code).emit('names')
的缩写
function (game_code){
return io.to(game_code).emit('names');
}
(不要介意return关键字,它只是箭头功能的一部分)