Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js Websocket聊天应用程序:客户端接收重复消息_Javascript_Node.js_Websocket - Fatal编程技术网

Javascript Node.js Websocket聊天应用程序:客户端接收重复消息

Javascript Node.js Websocket聊天应用程序:客户端接收重复消息,javascript,node.js,websocket,Javascript,Node.js,Websocket,我是Node.js的新手。我正在尝试使用Node.js、websocket实现一个聊天应用程序。我在服务器端使用的代码: var config = require('someconfigure'), socketServer = require('somewebsocketapi').server; var clients = [ ]; socketServer( 'example', function ( connection, server ) { var index

我是Node.js的新手。我正在尝试使用Node.js、websocket实现一个聊天应用程序。我在服务器端使用的代码:

var config        = require('someconfigure'),
socketServer  = require('somewebsocketapi').server;


var clients = [ ];


socketServer( 'example', function ( connection, server ) {
var index;

  connection.on('open', function ( id ) {
index = clients.push(connection) - 1;
console.log('[open]');
  });



  connection.on('message', function ( msg ) {

    console.log(msg);
    var content = JSON.parse(msg.utf8Data);
    var author = content.action.data[0].author;
    var channel = content.action.data[0].channel;
    var text = content.action.data[0].text;
    var time = (new Date()).getTime();
    console.log(author+text+channel);

    // send messsage to all clients

    var obj = JSON.stringify(
        { 
            command:"messages",
            data: [
                {
                    timestamp: time,
                    text: text,
                    author: author,
                    channel: channel
                }
            ] 
        }
        );
    console.log("Number of clients "+clients.length);
    for (var i=0; i < clients.length; i++) {
        if(clients[i]!= connection)
            clients[i].send(obj);
        }
  });

  connection.on('error', function ( err ) {
console.log(err);
  });

  connection.on('close', function(){
   console.log((new Date()) + " Peer "
            + index + " disconnected.");
        // remove user from the list of connected clients
        clients.splice(index, 1);
  });


}).config( config );
var config=require('someconfigure'),
socketServer=require('somewebsocketapi').server;
var客户=[];
socketServer('示例',函数(连接,服务器){
var指数;
连接.on('open',函数(id){
索引=客户端。推送(连接)-1;
console.log(“[open]”);
});
connection.on('message',函数(msg){
控制台日志(msg);
var content=JSON.parse(msg.utf8Data);
var author=content.action.data[0]。作者;
var channel=content.action.data[0]。通道;
var text=content.action.data[0].text;
var time=(新日期()).getTime();
console.log(作者+文本+频道);
//向所有客户端发送消息
var obj=JSON.stringify(
{ 
命令:“消息”,
数据:[
{
时间戳:时间,
文本:文本,
作者:作者,,
频道:频道
}
] 
}
);
console.log(“客户端数量”+客户端长度);
对于(变量i=0;i
我面临的问题是,客户收到了重复的消息。例如,如果连接了5个客户端,那么所有客户端都将收到相同的消息5次


我知道我错过了一些东西,但我怎样才能弥补呢?提前感谢您的帮助。

问题是您正在为每个客户端而不是客户端本身存储“连接”(适用于所有客户端),因此您正在为所有客户端发送N次消息。如果您对单个控件感兴趣,只需删除的循环就可以了,或者将实际的客户端存储在
on('open',…)
中。那么我如何分别保存所有客户端呢?您使用的是socket.io,然后是
on('open',function(socket){}中回调的第一个参数是“套接字”,而不是“id”。你应该把它保存起来。在我不知道的其他实现中,您可能应该检查它们的文档。检查以下示例: