Javascript Websockets节点。是否可以向所有连接的客户端(从服务器)广播消息,而不首先向客户端发送客户端消息

Javascript Websockets节点。是否可以向所有连接的客户端(从服务器)广播消息,而不首先向客户端发送客户端消息,javascript,node.js,websocket,broadcast,Javascript,Node.js,Websocket,Broadcast,有了NodeJS和websockets,我试图实现一个在线游戏服务器,对于一个乘数游戏,我让人们四处走动,能够看到彼此,但是当服务器产生新的敌人时,我希望能够将消息广播到所有连接的客户端 但是没有客户端先向服务器发送消息 例如,游戏会产生一个敌人,向所有客户端发送信息 到目前为止,我的代码是: /************************************************** ** NODE.JS REQUIREMENTS **************************

有了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();
};
废话废话废话——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(“更新”);,但是没有成功

我曾尝试通过当前已知的用户循环使用“this.emit”,但我总是得到“cannotcallmethodemit of undefined”,这太烦人了

但当我让客户端先发送消息时,例如,当客户端移动时,它会向服务器发送一些信息,服务器会做出以下反应:

 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
调用从
io=require(“socket.io”)
更改为:

io = require("socket.io").listen(8000)
然后,我需要更改所有依赖于
socket
变量的对应变量,例如:

从…起 到
然后广播就可以了,例如:
io.sockets.emit(“更新”)

好的,我解决了这个麻烦。我会为同一条船上的其他人发布答案。我必须删除sockets变量,并将io更改为:“io=require(“socket.io”).listen(8000)”,然后我需要更改依赖于socket变量的所有相应变量,例如:从:“socket.sockets.on”(“connection”,onSocketConnection);”更改为:“io.sockets.on”(“connection”,onSocketConnection);”然后广播就可以了,例如:io.sockets.emit(“更新”),我不能再播4个小时,我会在这个时间限制到期后再播。
socket.sockets.on("connection", onSocketConnection);
io.sockets.on("connection", onSocketConnection);