我正在尝试在我玩的在线浏览器游戏中创建一个新的套接字事件处理程序,这样我就可以在安装了相同用户脚本的玩家之间发送数据。
游戏使用socket.io,这是我到目前为止所做的:我添加了一个用户端socket.on处理程序,如下所示:
game.socket.on("hello", function() { console.log("hello there") })
我在两个连接到同一游戏的玩家上做过这个,但是当我这样做时:
game.socket.emit("hello")
只有发出发票的玩家才会注销hello there
。
我的猜测是服务器端没有发出名为hello
的事件的处理程序。有没有办法可以在不访问服务器端代码的情况下添加它,或绕过它并将数据直接发送给其他玩家?
答案 0 :(得分:1)
我会添加一点并将我的评论转换成答案:
socket.io连接是客户端和服务器之间的连接。从客户端,您可以在该连接上执行的所有操作都发送到服务器。因此game.socket.emit("hello")
只会向服务器发送消息。
如果您希望服务器将该消息发送给其他用户,则需要向服务器添加代码以侦听该消息,然后在收到消息时将其发送给其他玩家。 socket.io是服务器连接的客户端。
您无法在socket.io中直接从一个客户端发送到另一个客户端(或者socket.io所基于的websocket)。相反,您必须发送到服务器并让服务器将其转发给其他客户端。
答案 1 :(得分:1)
Socket.io已经推出房间(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'});
});
});
希望这会有所帮助!
答案 2 :(得分:1)
这是我向房间中所有连接的插座显示当前用户的操作:
服务器端
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'
});