当前位置: 首页 > 知识库问答 >
问题:

数组数据在通过套接字(socket.io)传输时被复制

戚俊美
2023-03-14

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

我的问题是,当我试图从屏幕上清除图像并从max/msp请求一首新歌曲(带有相应的图像和节奏)时,文件名变量数组(附加到filepath并用作img src URL)会加倍(或重新添加),并在每次从max发送新数组时保持复制。完全清除数组的唯一方法是停止Max和Node之间的连接并重新启动,这将丢失所有的套接字连接,需要浏览器刷新,基本上是重新启动App。

下面是一个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,依此类推。

我尝试简单地将imagearray.length=0;添加到sendarray()中,但没有成功。

共有1个答案

秦英发
2023-03-14

您没有重置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()
});
 类似资料:
  • 我编写了简单的服务器/客户端程序,其中客户端将一些硬编码数据以小块形式发送给服务器程序,服务器程序正在等待数据,以便将其打印到终端。在客户端,我在循环中调用send(),同时有更多的数据要发送,而在服务器上,我使用read()执行同样的操作,即返回的字节数为 如果我在完成发送后专门在客户端的套接字上调用close(),那么这个示例非常有效,但如果我不这样做,服务器将不会实际退出read()循环,直

  • 我有一个数组类型的。我必须在python中通过流/TCP套接字发送它。然后我必须在接收端接收相同的阵列。

  • 我试着做一个简单的服务器-客户机套接字通信,但服务器似乎无法正常工作。无论何时发送或接收,我都会收到此错误: 非插座上的插座操作:非插座上的插座操作 奇怪的是,这只会在服务器发送时出现。客户似乎还可以:

  • 我目前正在做一个使用网络的项目。我必须发送一个结构 我正在尝试使用 TCP 将结构包从一个套接字发送到另一个套接字。我试图像那样发送我的结构 但它不起作用,所以我试图将我的结构序列化为 char* 即使当客户端同步发送一个struct Header数据时,当我在服务器端读取数据时,数据也会损坏。为什么数据会损坏? 客户端发送循环 服务器接收循环:(由select()调用的函数) 插座- 当我运行这

  • 我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果:

  • 我正在创建服务器和客户端java应用程序。我想创建一个数组来存储我的套接字。我正在使用eclipse,当我输入这一行时: Eclipse给我一个错误说资源类型Socket[]没有实现java.lang.AutoCloseable。 我怎样才能解决这个问题? 谢谢你 尝试/捕捉语句: