【问题标题】:Add socket emit from client side从客户端添加套接字发射
【发布时间】:2016-11-05 14:48:00
【问题描述】:

我正在尝试在我玩的在线浏览器游戏中创建一个新的套接字事件处理程序,以便我可以在安装了相同用户脚本的玩家之间发送数据。

游戏使用 socket.io,这是我目前所做的:我添加了一个用户端 socket.on 处理程序,如下所示:

game.socket.on("hello", function() { console.log("hello there") })

我对连接到同一游戏的两个玩家执行此操作,但当我执行此操作时:

game.socket.emit("hello")

只有发出了emit的玩家才会退出hello there

我的猜测是服务器端没有一个处理程序来发出名称为hello 的事件。有没有办法可以在不访问服务器端代码的情况下添加它,或者绕过它并将数据直接发送给其他玩家?

【问题讨论】:

  • 您将不得不显示更大的代码上下文。 game.socket.emit("hello") 只会向一个套接字端点发送消息。如果该端点是您的服务器,并且您希望您的服务器随后将该消息发送给其他用户,则您需要向服务器添加代码以侦听该消息,然后在收到该消息时将其发送给其他玩家。 socket.io 是一个客户端到服务器的连接。您不能在 socket.io(或 websocket)中直接从一个客户端发送到另一个客户端。相反,您必须发送到服务器并让服务器将其转发给其他客户端。
  • 谢谢你的回答,我就是这么想的

标签: javascript node.js socket.io


【解决方案1】:

我会补充一点,把我的评论变成答案:

socket.io 连接是客户端和服务器之间的连接。从客户端,您对该连接所能做的就是发送到服务器。因此game.socket.emit("hello") 只会向服务器发送消息。

如果您希望您的服务器随后将该消息发送给其他用户,您需要向服务器添加代码以侦听该消息,然后在收到该消息时将其发送给其他玩家。 socket.io 是一个客户端到服务器的连接。

您不能在 socket.io 中(或在 socket.io 所基于的 websocket 中)直接从一个客户端发送到另一个客户端。相反,您必须发送到服务器并让服务器将其转发给其他客户端。

【讨论】:

    【解决方案2】:

    Socket.io 引入了 room (check),您可以从客户端发送消息并使用服务器端将该消息发送给所有房间成员,考虑到您的房间 id 是 room_one

    客户:

    var socket = io();  
    socket.on('connect',function(){      
          socket.emit('join','room_one');
          socket.emit('room_message',{hello:'hello'});
    });   
    socket.on('room_message',function(data){
          console.log(data);
    })   
    

    服务器:

    io.sockets.on('connection',function(socket){    
        socket.on('join',function(room){
            socket.join(room);
        });
        socket.on('room_message', function(data) {        
            io.to('room_one').emit('room_message',{world:'world'});
        });
    });
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      这就是我为显示房间中所有连接的套接字的当前用户所做的操作:

      服务器端

      socket.join(user.room);
      io.to(user.room).emit('roomData',{room:user.room, users: getUsersInRoom(user.room)});
      

      客户端

      socket.on('roomData',(data)=>{
          console.log(data);
          currentUsers.innerHTML='${data.users.length} Users Online in ${data.room} Room'
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        • 2013-04-01
        • 1970-01-01
        • 2021-11-09
        • 2016-09-01
        • 2013-11-14
        • 1970-01-01
        相关资源
        最近更新 更多