io.sockets.to(RoomID).emit在nodeJS上不起作用



代码:

io.sockets.to(findRoomID).emit('COMPLETE_MATCH', { start: "true" });
*findRoomID => bbbb

控制台:

{bbbbb:Room{sockets:{bbb:true,aaa:true},长度:2}}

但是客户端没有正确接收到COMPLETE_MATCH

我该怎么办??

我上传了套接字io服务器代码。

你能说出问题出在哪一部分吗?

我不知道问题出在哪一部分。

[服务器]

const app = require('express');
const http = require('http').Server(app);
const io = require('socket.io')(http);
var rooms = [];
var clients = [];
var clients = [];
var rooms = [];
io.on('connection', function(socket) {
socket.on('MATCH', function (data) {
socket.leave(socket.id);
var NickName = data.name;
socket.id = NickName;
clients.push(socket.id);
//search all rooms
var isEmpty = false;
var isNum = 0;
for (var ii = 0; ii < rooms.length; ii++)
{
if (rooms[ii].count < 2)
{
isEmpty = true;
isNum = ii;
}
}
if (isEmpty) //join room
{
var findRoomID = rooms[isNum].id;
rooms[isNum].sockets += ',' + socket.id;
rooms[isNum].count++;
socket.join(findRoomID);
//send msg to select room
io.in(findRoomID).emit('COMPLETE_MATCH', {start: "true"});
}
else //create room
{
var sockets = {
id: socket.id,
sockets : socket.id,
count: 1
}
rooms.push(sockets);
socket.join(socket.id);
}
});
});

客户端代码是在Unity 5.6.6上编写的。客户端可以正确地发出MATCH,但是当前无法获取COMPLETE_MATCH。[客户-Unity5.6.6]

public class ScSocket : MonoBehaviour {
public SocketIOComponent socket;
public Button btnMatch;
public InputField input;
public Text txTest;
void Start ()
{
btnMatch.onClick.AddListener(() => StartCoroutine(StartMatch()));
//
socket.On("COMPLETE_MATCH", OnCompletedMatch);
DontDestroyOnLoad(gameObject);
}
IEnumerator StartMatch()
{
yield return new WaitForSeconds(0.5f);
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("name", input.text);
socket.Emit("MATCH", new JSONObject(data));
}
void OnCompletedMatch(SocketIOEvent evt)
{
Debug.Log(evt);
txTest.text = JsonToString(evt.data.ToString(), """);
}
string JsonToString(string target, string s)
{
string[] newString = Regex.Split(target, s);
return newString[1];
}
}

如果要将COMPLETE_MATCH广播到findRoomID中除发送方之外的所有客户端,请使用:

socket.broadcast.to(findRoomID).emit('COMPLETE_MATCH', { start: "true" });

但是,如果您想在"findRoomID"中设置为所有客户端,请使用

io.in(findRoomID).emit('COMPLETE_MATCH', { start: "true" });

在服务器代码中,使用socket.id作为已连接套接字的房间名称,但socket.id是每个已连接套接字唯一的标识符,由socket.io引擎生成。我建议用随机数生成您的房间名称,不要更改socket.id

[服务器]

const app = require('express');
const http = require('http').Server(app);
const io = require('socket.io')(http);
var clients = [];
var rooms = [];
io.on('connection', function(socket) {
socket.on('MATCH', function (data) {
if(socket.roomName){
socket.leave(socket.roomName);
}

socket.NickName = data.name;
clients.push(socket);
//search all rooms
var isEmpty = false;
var isNum = 0;
for (var ii = 0; ii < rooms.length; ii++)
{
if (rooms[ii].count < 2)
{
isEmpty = true;
isNum = ii;
break;
}
}
if (isEmpty) //join room
{
var findRoomID = rooms[isNum].id;
rooms[isNum].sockets.push(socket.id);
rooms[isNum].count++;
socket.join(findRoomID);
//send COMPLETE_MATCH to all sockets of this room
io.in(findRoomID).emit('COMPLETE_MATCH', {start: "true"});
}
else //create room
{
//generate a random room name
let roomName = Math.round(Math.random()*(999999999 - 100000000)+ 100000000).toString();
let room = {id: roomName, sockets:[], count: 0};
socket.join(roomName);
socket.roomName = roomName;
room.sockets.push(socket.id);
room.count++;
rooms.push(room);
}
});
});

最新更新