在 node.js 上的 socket.io 上发送消息 client->server->client

Posted

技术标签:

【中文标题】在 node.js 上的 socket.io 上发送消息 client->server->client【英文标题】:Sending messages client->server->client on socket.io on node.js 【发布时间】:2012-05-22 22:48:57 【问题描述】:

我正在使用 NodeJS+Socket.IO 进行简单的网页游戏。有用。为什么?

这是我的server.js

var app = require('express').createServer();
var io = require('socket.io').listen(app);

io.sockets.on('connection', function (socket) 
socket.on('set nickname' , function (nickname) 
socket.nickname = nickname;
console.log(nickname + ' just connected!');

);

socket.on('msg' , function (msg) 
socket.msg = msg;
io.sockets.emit('response', msg);
);

socket.on('updatePlayer' , function (updatePlayer) 
console.log("Someone just moved on the map!");
);

);

app.listen(8080);

我知道它有效的原因是,当我加载页面并执行此脚本时:

// SERVER STUFF
socket.on('connect', function () 
    console.log('We are connected!');
    name = $(".name").val();
    this.emit('set nickname', name, function (success) );
    msg = name + "|" + currX + "|" + currY + "|" + currentMap;
    this.emit('msg', msg, function (success) );

    socket.on('response', function (data) 
        var theMsg = data.split("|");
        sayDialog("New player! " + theMsg[0] + " connected on map " + theMsg[3] + " on coordinates (" + theMsg[1] + "," + theMsg[2] + ")");
    );
);

我进入我的对话框(“CSS div”)类似于New player! weka connected on map 4 on coordinates (10,5)

好的,很酷,所以它起作用了!但是,当我“移动”时,我尝试使用它向服务器发送消息

  socket.on('updatePlayer', function () 
    console.log("Testing...");
  ); 

我什至没有看到 console 说测试。我不知道为什么。

【问题讨论】:

你是如何触发updatePlayer事件的? 不是socket.on('updatePlayer', function () 而是我怎么不认为我在触发它...我怎么触发它? 你必须从服务器触发它到客户端:例如this.emit('updatePlayer', msg);来自服务器。 @weka 完全按照威尔克的建议 - 你需要 emit 事件 【参考方案1】:

客户端。玩家移动并执行函数 movePlayer:

function movePlayer () 
    socket.emit ('player move', map: 4, coords: '0.0');


socket.on ('updatePlayer', function (msg) 
    console.log ('A player moves on map ' + msg.map + ' on coords ' + msg.coords);
);

服务器端。 当有人移动时,会为除原始玩家之外的每个套接字发出“updatePlayer”。在每个客户端,updatePlayer 都会被拦截。

socket.on ('player move', function (msg) 
    io.sockets.emit ('updatePlayer', msg);
);

【讨论】:

【参考方案2】:

服务器端

socket.on('updatePlayer', function(updatePlayer)
  console.log("Someone just moved on the map!")
  updatePlayer() // will trigger the client side function
);

客户端

socket.emit('updatePlayer', function()
  console.log('testing');
)

【讨论】:

以上是关于在 node.js 上的 socket.io 上发送消息 client->server->client的主要内容,如果未能解决你的问题,请参考以下文章

STOMP 上的重复事件 Socket.io 和 Node.js

Flask socket.IO 服务器上的 Node.js Socket.io 客户端

node.js 上的 Socket.io-client 只工作一次

Heroku 上的 Socket.io 聊天应用程序与 node.js

在 node.js 上的 socket.io 上发送消息 client->server->client

如何在 node.js 服务器上的 PHP Web 服务器和 Socket.io 之间创建握手?