繁体   English   中英

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

[英]Websockets-NodeJS. Is it possible to broadcast a message to all connected clients(from the server) without having a client message the client first

有了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”,但我总是得到“不能调用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变量的相应变量,例如:

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

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

然后播放很好,例如: io.sockets.emit("updates")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM