javascript - 通过套接字传输时数组数据被复制(Socket.io)

标签 javascript node.js arrays socket.io max-msp-jitter

我有一个 NodeJS 服务器,它使用 Socket.io 套接字从 Max/MSP(带有 Max-api 模块)接收数据。消息包括文件目录名称(其中包括特定歌曲的小节、音符和歌词的图像)、歌曲的节奏(2、4、6 或 8,在 Node 客户端中乘以 100 并动态添加到节奏中) setInterval 函数中的变量以对幻灯片中的图像进行动画处理),最后是一个开始和停止消息来控制浏览器中的幻灯片动画。

我的问题是,当我尝试清除屏幕上的图像并从 Max/MSP 请求新歌曲(具有相应的图像和节奏)时,文件名变量数组(附加到文件路径并用作 img src url) 被加倍(或重新添加),并且每次从 Max 发送新数组时都会重复复制。完全清除数组的唯一方法是停止 Max 和 Node 之间的连接并重新启动它,这会丢失所有套接字连接,需要刷新浏览器,并且基本上会重新启动应用程序。

下面是一个Max-api模块,它作为socket.io客户端并将消息从Max/MSP传输到Node:

const imageArray = [];
const binaryDir = (path.join(__dirname, 'public', 'src/'));
var filePath; 
var basePath;

//FUNCTION TO SEND ARRAY AND REL FILE PATH TO SERVER.JS
function sendArray() {
    if (imageArray.length != 0) {
        socket.emit("imageArray", imageArray, basePath);
    } 
};

//FUNCTION TO LOAD FILES IN FILE PATH WITH DIR NAME PROVIDED BY MAX IN HANDLER (songName)
function load() {
        fs.readdir(filePath, (err, files) => {
            files.forEach( file => {
                imageArray.push(file);
            })
            console.log("FILES" + files)
            sendArray()
            console.error(err)
        });
};

// MAX HANDLER
maxApi.addHandler('filepath', (songName) => {
    filePath = path.join(binaryDir, songName)
    basePath = path.basename(filePath)
    load()
});

服务器接收 imageArray 和 basePath 数据并直接发送到客户端:

   socket.on("imageArray", (imagearray, basepath)=>{
         socket.broadcast.emit("images", imagearray, basepath );
         console.log('Server received images..', imagearray.length);
   });

我不确定这是否是socket.io问题。我知道问题出在上面代码中的某个地方,因为当我使用 console.log('Server receive images..', imagearray.length); 时,发送的第一个数组是“Server receive images..” 56”,当我发送另一个数组时,它会增加到 112,然后是 168,依此类推。

我知道问题不在于 Max,因为当我使用 maxApi.post(`Dir from node ${files}`) 登录 Max 控​​制台时,它仅打印 56 个图像文件每次都数组。

我尝试简单地将 imageArray.length = 0; 添加到 sendArray() 但无济于事。

最佳答案

您没有重置 imageArray,因此它保留现有值,有很多方法可以做到这一点,但我更喜欢以下一种:

const binaryDir = (path.join(__dirname, 'public', 'src/'));

var filePath; 
var basePath;

//FUNCTION TO SEND ARRAY AND REL FILE PATH TO SERVER.JS
function sendArray(myArray) {
    if (myArray.length != 0) {
        socket.emit("imageArray", myArray, basePath);
    } 
};

//FUNCTION TO LOAD FILES IN FILE PATH WITH DIR NAME PROVIDED BY MAX IN HANDLER (songName)
function load() {
        fs.readdir(filePath, (err, files) => {
            let myArray = [];
            files.forEach( file => {
                myArray.push(file);
            })
            console.log("FILES" + files)
            sendArray(myArray)
            console.error(err)
        });
};

// MAX HANDLER
maxApi.addHandler('filepath', (songName) => {
    filePath = path.join(binaryDir, songName)
    basePath = path.basename(filePath)
    load()
});

关于javascript - 通过套接字传输时数组数据被复制(Socket.io),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61010238/

相关文章:

Java 程序在 "for"循环后卡住

javascript - 从数据库获取文档快照并将其 ServerValue.TIMESTAMP 值转换为日期

javascript - JavaScript 中的图像链接

node.js - 使用 http-proxy 与 node.js 进行负载平衡

node.js - 将套接字作为 Socket.io 参数传递?

php - 将json字符串的某些值转换为php中的整数

Javascript 函数无法按功能运行

javascript - 如何居中对齐 Material-ui TextField 文本并设置最小数值?

node.js - 如何在 MongoDB 中 findOne 之后仅显示数组的一部分?

用于树结构的类似 Python numpy 的接口(interface)