io.sockets.to (RoomID) .emit не беспокоиться о nodeJS - PullRequest
0 голосов
/ 05 декабря 2018

Код:

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

 *findRoomID => bbbb

Консоль:

{bbbb: Комната {сокеты: {bbbb: true, aaa: true}, длина: 2}}

Но клиент не получил COMPLETE_MATCH правильно

Что мне делать ??

Я загрузил код сокета io server.

Можете ли выскажите, какая часть является проблемой?

Я не могу сказать, какая часть является проблемой.

[Сервер]

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];
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Если вы хотите передать 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);

        }

    });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...