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