在用webrtc做视频通信的时候就想过另一个问题,能否利用点对点技术进行文件传输呢,如果能实现那点对点通信将大有可为。
经过一番研究,发现真有相关功能。点对点通信的关键在于rtcPeerConnection,而通过它能得到一个rtcDataChannel。这个channel就是数据传输的通道,我们可以像websocket一样操作它。
通过给rtcDataChannel注册onmessage事件可以收取来自对方的数据,直接使用send方法可以给对方发送数据。
发送文字类消息比较简单,直接把字符串做为send方法的入参就可以了。而要发送文件还需要另外的处理。
因为一次发送的数据字节是有限制的,所以文件的发送需要把文件转成arraybuffer,然后分成不同的块(16k)按照顺序发送出去。因为是分块发送出去的,所以得知道arraybuffer的总长度,并告知接收方。
接收方按照总长度,收取一段一段的数据,并拼接成一个完整的文件,至此完成整个的文件传输过程。
至于文件总长度怎么告知接收方,我们可以先发送一个普通的字符串消息,然后再有顺序的发送文件数组块。当然还有另一种更好的方式,将文件总长度添加到arraybuffer的前面几个字节,做为元数据一起发送给接收方,这就是自定义协议了。
另外需要注意的是,循环发送文件块的时候当发送量达到了16M,需要做处理,否则会抛出通道缓存队列占满异常导致文件传输失败