通过套接字传输时数组数据被复制 (Socket.io)
Array data being duplicated when transmitted via socket (Socket.io)
我有一个 NodeJS 服务器,它使用 Socket.io 套接字从 Max/MSP(使用 Max-api 模块)接收数据。消息包括文件目录名称(其中包括特定歌曲的小节、音符和歌词的图像)、歌曲的速度(2、4、6 或 8,在 Node 客户端中乘以 100 并动态添加到速度setInterval 函数中的变量来为幻灯片中的图像设置动画),最后是开始和停止消息来控制浏览器中的幻灯片动画。
我的问题是,当我尝试清除屏幕上的图像并从 Max/MSP 请求一首新歌曲(具有相应的图像和速度)时,文件名变量数组(附加到文件路径和用作 img src url's) 被加倍(或重新添加),并在每次从 Max 发送新数组时保持复制。彻底清除数组的唯一方法是停止 Max 和 Node 之间的连接并重新启动它,这会丢失所有套接字连接,需要刷新浏览器,并且基本上会重新启动应用程序。
下面是一个Max-api模块,作为socket.io客户端,将消息从Max/MSP传输到节点:
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 received images..', imagearray.length);
时,发送的第一个数组是 "Server received 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()
});
我有一个 NodeJS 服务器,它使用 Socket.io 套接字从 Max/MSP(使用 Max-api 模块)接收数据。消息包括文件目录名称(其中包括特定歌曲的小节、音符和歌词的图像)、歌曲的速度(2、4、6 或 8,在 Node 客户端中乘以 100 并动态添加到速度setInterval 函数中的变量来为幻灯片中的图像设置动画),最后是开始和停止消息来控制浏览器中的幻灯片动画。
我的问题是,当我尝试清除屏幕上的图像并从 Max/MSP 请求一首新歌曲(具有相应的图像和速度)时,文件名变量数组(附加到文件路径和用作 img src url's) 被加倍(或重新添加),并在每次从 Max 发送新数组时保持复制。彻底清除数组的唯一方法是停止 Max 和 Node 之间的连接并重新启动它,这会丢失所有套接字连接,需要刷新浏览器,并且基本上会重新启动应用程序。
下面是一个Max-api模块,作为socket.io客户端,将消息从Max/MSP传输到节点:
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 received images..', imagearray.length);
时,发送的第一个数组是 "Server received 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()
});