javascript - Websockets-NodeJS。是否可以向所有连接的客户端(从服务器)广播消息,而无需先向客户端发送客户端消息

标签 javascript node.js websocket broadcast

使用 NodeJS 和 websockets,我正在尝试实现一个在线游戏服务器,对于乘数游戏,我让人们四处移动并能够看到彼此,但是当服务器产生新的敌人时,我希望能够将消息广播给所有连接的客户端。

但是客户端没有先向服务器发送消息。

例如 - 游戏产生一个敌人,向所有客户端发送信息。

到目前为止我的代码:

/**************************************************
** NODE.JS REQUIREMENTS
**************************************************/

var util = require("util"),                 
// Utility resources (logging, object inspection, etc)

    io = require("socket.io"),              
// Socket.IO

    Player = require("./Player").Player,    // Player class
    Zombie = require("./Zombie").Zombie;

// Socket controller

var socket, 

// Array of connected players   

    players,

    zombies;

var level = 1,
    score = 0,
    levelling = false;



function init() {
    // Create an empty array to store players

    players = [];

    zombies = [];

    // Set up Socket.IO to listen on port 8000

    socket = io.listen(8000);

    // Configure Socket.IO

    socket.configure(function() {
        // Only use WebSockets

        socket.set("transports", ["websocket"]);


        // Restrict log output

        socket.set("log level", 2);
    });

    // Start listening for events

    setEventHandlers();
};

blah blah blah -- tl;dr -- 游戏循环:

function mainLoop(){

//Main loop for the server. Called 60 times a second. May be modified for game  
     speed.
//setTimeout(mainLoop, 1000/5000);

this.broadcast.emit("update"); 

    //THIS broadcast.emit line is where the error is being thrown. I need to know how   
    to broadcast here without the client initializing first.
};

我尝试了一些方法,socket.broadcast.emit("update");,但没有成功。

我尝试过循环当前已知的用户并使用“this.emit”,但我总是得到“无法调用未定义的方法发出”,太烦人了。

但是当我让客户端先发送消息时,例如,当客户端移动时,它会向服务器发送一些信息,服务器会使用react:

 function onSocketConnection(client) {
        util.log("New player has connected: " + client.id);

        // Listen for client disconnected

        client.on("disconnect", onClientDisconnect);

        // Listen for new player message

        client.on("new player", onNewPlayer);

        // Listen for move player message

        client.on("move player", onMovePlayer);

        //listen for deaths

        client.on("death", onPlayerDeath);

        //listen for not moved message, to stop sprite animation

        client.on("not moved", notMoved);
    };

    // Player has moved

    function onMovePlayer(data) {
        // Find player in array

        var movePlayer = playerById(this.id);

        // Player not found

        if (!movePlayer) {
            util.log("Player not found: "+this.id + " when asking if moved");
            return;
        };

        // Update player position
        movePlayer.setX(data.x);
        movePlayer.setY(data.y);
        movePlayer.setDir(data.dir);

        // Broadcast updated position to connected socket clients

        this.broadcast.emit("move player", {id: movePlayer.id, x:
            movePlayer.getX(), y:movePlayer.getY(), dir: movePlayer.getDir()});
    };

然后“this.broadcast.emit”就没有问题了。不抛出错误。

最佳答案

好的,我解决了这个烦恼。我会将答案发布给同样处境的其他人。我必须删除 socket 变量,并从 io = require("socket.io")< 更改 io require 调用 至:

io = require("socket.io").listen(8000)

这样我就需要更改依赖于 socket 变量的所有相应变量,例如:

来自

socket.sockets.on("connection", onSocketConnection);

io.sockets.on("connection", onSocketConnection); 

然后广播就可以了,例如:io.sockets.emit("updates")

关于javascript - Websockets-NodeJS。是否可以向所有连接的客户端(从服务器)广播消息,而无需先向客户端发送客户端消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15486687/

相关文章:

node.js - 运行 NodeJS 事件循环/等待子进程完成

javascript - Node.js 中的 Google map 几何库

spring - Spring Websocket 中的 Direct、Group、Channel 需要多少个端点和主题?

javascript:访问父函数的所有变量

php - 如何将此表单放入对话框?

JavaScript/TypeScript Array interface[] ,按类型分组以发送多个函数中的 1 个

json - 验证 Node 中 swagger json.schema 的 POST 数据

websocket - 如何将 blob 转换为图像数据?

Java Websocket 发出数组

javascript - 如何获取代表 slickgrid 中所选行的对象