【发布时间】:2015-08-10 05:17:44
【问题描述】:
我用的是PeerJS,但是觉得这个问题大概是WebRTC的问题,希望大家帮帮我:
我正在尝试编写一个简单的点对点文件共享。我将serialisation: "none" 用于PeerJS 连接DataChannel,因为我发送的只是纯ArrayBuffers。
10mb 左右的文件一切都很好,但我在发送更大的文件(30+ mb)时遇到问题,例如在对等方之间发送大约 10-20 个 900mb zip 文件连接的第一块之后开始抛出Connection is not open. You should listen for the "open" event before sending messages。 (在Sender 一侧)
我的设置:
文件拖放到拖放,Sender 使用FileReader 将其读取为ArrayBuffer,以 64x1024 字节的块(与 16x1024 没有区别)并且一旦读取每个块 - 它就通过 peer.send(ChunkArrayBuffer )。
Reciever 从每个收到的块中创建blob,在传输完成后从这些块中创建一个完整的blob 并提供给用户的链接。
我的对等连接设置:
var con = peer.connect(peerid, {
label: "file",
reliable: true,
serialization: "none"
})
我的发送功能:
function sliceandsend(file, sendfunction) {
var fileSize = file.size;
var name = file.name;
var mime = file.type;
var chunkSize = 64 * 1024; // bytes
var offset = 0;
function readchunk() {
var r = new FileReader();
var blob = file.slice(offset, chunkSize + offset);
r.onload = function(evt) {
if (!evt.target.error) {
offset += chunkSize;
console.log("sending: " + (offset / fileSize) * 100 + "%");
if (offset >= fileSize) {
con.send(evt.target.result); ///final chunk
console.log("Done reading file " + name + " " + mime);
return;
}
else {
con.send(evt.target.result);
}
} else {
console.log("Read error: " + evt.target.error);
return;
}
readchunk();
};
r.readAsArrayBuffer(blob);
}
readchunk();
}
有什么想法会导致这种情况吗?
更新:在块传输之间设置 50ms 超时有点帮助,900mb 文件加载在开始抛出错误之前达到了 6%(而不是之前的 1-2%)。也许这是通过datachannel 的同时操作的某种限制或溢出某种datachannel 缓冲区?
更新1:这是我的PeerJS 连接对象,其中有DataChannel 对象:
【问题讨论】:
-
我在某些时候遇到过同样的问题,但现在没有了。我的代码在 github 结束,但用 dart 编写。也许它有帮助!我将
{'ordered': true, 'reliable': true}添加到createDataChannel也许有帮助? -
@Robert 遗憾的是这并没有帮助,“有序”和“可靠”在我的
DataChannel对象中已经是真的peerjs连接对象。我现在将我的连接对象添加到问题中,你能把你的扔在这里,所以我可以比较两个吗? -
我的 github 代码有一个链接。我没有使用 peerjs,所以在这里我不能真正帮助你:( 对我来说,FileReader 需要大约 25-50 毫秒来将 blob 转换为 bytearray,这似乎足以让它对我有用。
-
@Robert 我的意思是在运行时创建的连接对象,当您连接到另一个对等点时,您正在使用该对等点发送消息。当然,如果您现在可以轻松访问它。老实说,设置 localhost 来运行你的代码来查看一个对象有点麻烦。
-
DataChannel 看起来一模一样。
标签: javascript webrtc file-sharing chunks peerjs