【问题标题】:Socket.io - Cannot emit to a specific room but can emit to everyoneSocket.io - 不能发射到特定的房间,但可以发射到每个人
【发布时间】:2018-01-22 05:55:28
【问题描述】:

我正在使用Socket.io 2.0.4React.js (CRA)

背景:在我的服务器代码 (server.js) 中,一旦有人成功加入房间,我想发出一个事件,告诉该房间中的所有客户端有人加入。

问题:如果我尝试将.to(room).in(room).emit 结合使用...但@987654326 @ 将自行工作。

工作原理:我成功地实现了socket.join() 代码,并在回调中控制台记录了使用我创建的showClients 函数加入的每个人的ID。我可以通过控制台看到每个人一次加入一个。

注意:我将房间名称存储在数据变量中并使用data.room 访问它,但我也只是手动写入房间名称无济于事。

客户代码(删节)

import React, {Component} from 'react';
import Card from '../card/card';
import './game.css';

const io = require('socket.io-client');
const socket = io()  

class Game extends Component {

    constructor(props){
        super();
    }

componentDidMount(){
        this.gameCode();
        this.cardSelected();

        socket.on("cardDiscarded", this.updateDiscard);

        socket.on("playerJoined", () => {
            alert("hi!");
            console.log("YAY!!!!!!!!!!!!!!!!!!!!");
        });
    }
   //....rest of my code....
}

服务器代码(删节)

joinRoom函数看问题

const express = require('express');

const app = express();
const port = process.env.PORT || 5000;

const http = require("http").Server(app);
var io = require("socket.io")(http);

var bodyParser = require('body-parser');

console.log("Hello world!");

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

io.on("connection", (socket) => {

    socket.on("createNewRoom", (name) =>{
        CreateNewRoom();
        console.log("NEW ROOM CREATED!");
    })

    socket.on("joinRoomRequest", (name, room) =>{
        // console.log(name, room);
        console.log("Request to join room");
        var data = {
            name: name,
            room: room
        };
        joinRoom(data);
    })


    function CreateNewRoom() {
        //Get unique room number
        var thisGameId = (Math.random() * 1000000 ) | 0;

        //Send the room number to the browser
        socket.emit('newRoomCreated', {roomID: thisGameId, mySocketID: socket.id});
        //Tell socket.io this user is joining this room
        socket.join(thisGameId.toString());
        console.log(thisGameId);
    };

    function joinRoom(data){
        console.log("trying to join room:" + data.room);
        data.socketID = socket.id;
        console.log(data);
        socket.join(data.room, () => {
            let rooms = Object.keys(socket.rooms);
            //Let the clients know a player has joined
            console.log(rooms);
            console.log(data.name + " JOINED room " + data.room);
            showClients(data.room);
            io.to(data.room).emit("playerJoined");  //<----- DOESN't WORK
        });
    }

    function showClients(room){
        var roomClients = io.of('/').in(room).clients((err, data)=>{
            if (err) throw err;
            console.log("The people in room ", room, " are: ", data);
        })
    }
})

【问题讨论】:

  • 你在哪里发送createNewRoom
  • 在客户端的另一个反应组件中。然后它成功地创建了房间,因为newRoomCreated emit 被客户端拾取了。
  • joinRoomRequest 在哪里调用?如果您确定一切设置正确并被击中,我会说您的 io.to 应该是 io.sockets.in(roomName).emit('playerJoined', 'Some Data')
  • 在一个单独的 React 组件中,当用户单击 DOM 中的加入按钮时,我会发出 joingRoomRequest 事件。 socket.emit("joinRoomRequest",guestName, room);

标签: node.js socket.io


【解决方案1】:

我相信io.in(room).emit(data) 是您正在寻找的。我最近也遇到了这个问题。根据文档,如果您想向所有人发出接受“套接字”(也就是加入的用户),您可以使用socket.to(room).emit。如果您想向包括用户在内的所有人发出,请使用io.in(room).emit

【讨论】:

  • 我都试过了,都不管用。问题似乎是 .in 破坏了功能或无法将其发送到正确的房间,即使我尝试将其发送到 data.room1234"1234" (注意:我喜欢使用房间 1234我的测试)
  • 我可以只使用.emit().broadcast.emit() 将其发送给每个人...但是当我介绍.in(room) 时它会中断。
  • socket.to(room).emit 工作吗?使用房间功能的任何东西都有效吗?
  • socket.to(room).emit 也不起作用。唯一可行的是这些行...socket.join(data.room, () =&gt; { let rooms = Object.keys(socket.rooms); console.log(rooms);}); 列出了我创建的房间和成员。
  • 我开始认为我的 socket.io 没有正确导入/设置。我可以让socket.to(room).emit 在我的&lt;Lobby /&gt; 组件中工作,但不能在我的&lt;App&gt;&lt;Game /&gt; 组件中工作
【解决方案2】:

我设法这样解决它:

不起作用:

socket.join (my_room)

工作:

socket.join (my_room.toString ())

【讨论】:

  • 你拯救了我的一天。
  • 这是我一直在寻找的答案...我使用来自 mongodb 的 id 作为房间名称,即使它列在房间列表中,尝试向房间发送数据也没有工作......只有在同时制作了 socket.join() 和 io.to()... 使用 toString() 之后它才工作,谢谢
  • 面对相同...让 roomName = "room_" + roomNumber.toString() 为我工作
  • 我正在使用字符串作为房间...它仍然无法正常工作
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多