Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.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_Fuse - Fatal编程技术网

Javascript 如何将缓冲区直接写入Node.js中的websocket流而不转换为字符串?

Javascript 如何将缓冲区直接写入Node.js中的websocket流而不转换为字符串?,javascript,node.js,websocket,fuse,Javascript,Node.js,Websocket,Fuse,这个有点浓。我正在Node.js(v14.14.0)中使用 为了在客户机和服务器之间传输文件数据,我使用来来回传输二进制数据 当将文件从服务器传输到客户机时,这很好,但是当尝试将文件从客户机传输到服务器时,我遇到了一个问题 fuse native使用正在传输的文件的二进制段传递缓冲区实例。我正在尝试将缓冲区写入websocket流,并在服务器上接收它,然后将其流式传输到临时文件 这是怎么发生的。在客户端,调用以下方法: 写入(缓冲区){ log('write buffer pre-slice',

这个有点浓。我正在Node.js(v14.14.0)中使用

为了在客户机和服务器之间传输文件数据,我使用来来回传输二进制数据

当将文件从服务器传输到客户机时,这很好,但是当尝试将文件从客户机传输到服务器时,我遇到了一个问题

fuse native使用正在传输的文件的二进制段传递缓冲区实例。我正在尝试将缓冲区写入websocket流,并在服务器上接收它,然后将其流式传输到临时文件

这是怎么发生的。在客户端,调用以下方法:

写入(缓冲区){
log('write buffer pre-slice',buffer)
const write\u stream=WebSocketStream(`ws://localhost:5746/?socket\u uuid=${this.socket\u uuid}&node\u uuid=${this.node\u uuid}&length=${this.length}&position=${this.position}&writing\u file=true`{
perMessageDeflate:false,
是的,
})
console.log(写入流)
console.log('writing buffer',buffer.toString(),buffer)
写入流推送(缓冲区)
write_stream.push(空)
}
根据Node.js文档,我应该能够将缓冲区直接传递到流。但是,在服务器上,从未收到任何数据。以下是服务器接收信息的方式:

async on_file_write_stream(流,请求){
让{socket_uuid,node_uuid,length=4096,position=0}=url.parse(request.url,true).query
如果(位置类型=='string')位置=parseInt(位置)
if(typeof length==='string')length=parseInt(length)
const socket=this.sockets.find(x=>x.uuid===socket\u uuid)
如果(!socket.session.temp_write_files)socket.session.temp_write_files={}
const placeholder=socket.session.temp_write_files?[node.uuid]| | wait tmp.file()
socket.session.temp\u write\u文件[node.uuid]=占位符
log('上载占位符:',占位符)
console.log('write stream',stream)
log('write data',{占位符,位置,长度})
stream.pipe(fs.createWriteStream(placeholder.path,{flags:'r+',start:position}))
}
客户端代码完成后,临时文件仍然是完全空的。没有数据被写入

奇怪的是,当我在将缓冲区写入流(在客户端)之前将其转换为字符串时,所有操作都按预期进行:

写入(缓冲区){
log('write buffer pre-slice',buffer)
const write\u stream=WebSocketStream(`ws://localhost:5746/?socket\u uuid=${this.socket\u uuid}&node\u uuid=${this.node\u uuid}&length=${this.length}&position=${this.position}&writing\u file=true`{
perMessageDeflate:false,
是的,
})
console.log(写入流)
console.log('writing buffer',buffer.toString(),buffer)
write_stream.push(buffer.toString())
write_stream.push(空)
}
这对于基于文本的文件很好,但是二进制文件在以这种方式传输时会被损坏。我怀疑这是因为转移前的字符串

如何在不先将缓冲区数据转换为字符串的情况下沿流发送缓冲区数据?当我直接写入缓冲区时,我不确定为什么服务器端流没有接收数据

提前谢谢


出于好奇,这里是完整的。

一种黑客行为,但我通过在客户端对缓冲区进行base64编码,在服务器端对其进行解码,解决了这个问题

感谢用户为我指明了方向,我用管道将缓冲区传输到流:

const combined_stream=CombinedStream.create()
组合的\u stream.append(buffer.toString('base64'))
组合流管道(写入流)
然后,在服务器端对其进行解码:

const encoded\u buffer=等待此消息。\u bufferStream(流)
const decoded_buffer=新缓冲区(编码的_buffer.toString(),'base64')
log({encoded_buffer,decoded_buffer})
const combined_stream=CombinedStream.create()
组合的\u流。追加(解码的\u缓冲区)
组合的_stream.pipe(fs.createWriteStream(placeholder.path,{flags:'r+',start:position}))

不过,这是次优的,因为从base64来回转换需要处理,并且会造成带宽损失。我仍然很好奇为什么我不能向websocket流写入二进制缓冲区的原始问题。也许这是库的一个限制。

U将能够将您的数据传输到websocket流。看看这个例子,因为FUSE实现,我必须从客户端的缓冲区读取数据。如果websocket流实际上在服务器上接收到数据,它会很好地写入文件。然后,您应该能够使用组合流将缓冲区转换为流?看一看这个例子,我认为它应该做到这一点,嗯。刚刚尝试过,但它似乎与我直接传递缓冲区时有相同的问题。服务器端没有写入任何数据。