基础建立DataChannel的步骤
| Description | Detail | |
| 1 | SingalConnection类中创建DataChannel | PeerConnection Create DataChannel |
| 2 | SignalConnection实现了webrtc:PeerConnectionObserver | 有很多函数在OnDataChannel(rtc::scoped_refptr<webrtc:DataChannelInterface> InDataChannel)中 注册当前类为Observer InDataChannel→RegisterObserver(this);以便于后续消息函数等都可以在本类的实现中. |
| 3 | SignalConnection实现了webrtc:DataChannelObserver接口 | 实现主要函数void OnStateChange();void OnBufferedAmountChange(unit64_t PreviousAmount) override;void OnMessage(const webrtc:DataBuffer& inBuffer) override; |
| 4 | 第二部获取到的Handler后续可以在任何需要发送数据的地方调用mDataChannel→send 方法 | 发送文本内容 |
| 5 | 获取的数据,后续在Onmessage函数中可以得到。这里我们解析了JSON格式的。 |
如何准备一个DataBuffer数据,代码示例
rtc::CopyOnWriteBuffer myBuffer;myBuffer.SetData(myData,myDataSize); //其中myData是一个 char* , myDataSize是一个int 或者size_tmDataChannel->Send(webrtc::DataBuffer(myBuffer,true); |
个人技术博客: fuqifacai.github.io
更多技术资讯下载: 2img.ai
相关配图由微信小程序【字形绘梦】免费生成

更多的代码示例
/// <summary>
/// 传送文本数据
/// </summary>
/// <param name="text"></param>
void QLSignalConnection::SendTextViaDataChannel(const std::string& text)
{
webrtc::DataBuffer buffer(rtc::CopyOnWriteBuffer(text.c_str(), text.size()), false);
mDataChannel->Send(buffer);
}
/// <summary>
/// 传送二进制数据
///
/// </summary>
/// <param name="myFinalPngBinaryData"></param>
/// <param name="sizeOfData"></param>
void QLSignalConnection::SetBinaryDataViaDataChannel(unsigned char* myFinalPngBinaryData,size_t sizeOfData)
{
//Just send via data channel handler
//进行分片传输,确保大数据没问题
rtc::CopyOnWriteBuffer myBuffer;
//myBuffer.SetData(myData, myDataSize);
myBuffer.SetData(myFinalPngBinaryData, sizeOfData);
////byte,分块大小,我们可以自己定义,但是貌似100K一个比较合理
//单次发送数据长度大于256*1024字节时,会引发2中提到的崩溃,此时send_result=SDR_ERROR,即发送错误
unsigned int sliceSize = 100*1024;
unsigned int totalBufferSize = myBuffer.size();
unsigned int totalSteps = (totalBufferSize - 1) / sliceSize + 1;
Json::Value sendMessage;
sendMessage["sendDataType"] = "bmpFileBuffer";
sendMessage["dataSize"] = sizeOfData;
sendMessage["totalSendTimes"] = totalSteps;
//这里发送一个指令,告诉前端后面是一个什么样的数据,多长,你要怎么接受。
std::string sendMessageString = QLJsonHelper::json_2_string(sendMessage);
SendTextViaDataChannel(sendMessageString);
//unsigned int totalSteps = (totalBufferSize-1)/sliceSize + 1;
rtc::CopyOnWriteBuffer temp;
//DataBuffer第二个参数必须为true,确保接受顺序
for (unsigned int i = 0; i < totalSteps; i++)
{
if (i == totalSteps - 1)
{
temp = myBuffer.Slice((i * sliceSize), (myBuffer.size() - (i * sliceSize)));
mDataChannel->Send(webrtc::DataBuffer(temp, true));
}
else
{
temp = myBuffer.Slice((i * sliceSize), sliceSize);
mDataChannel->Send(webrtc::DataBuffer(temp, true));
}
}
}
代码讲解
上述的代码中,第一种我们纯文本内容的发送直接调用发送函数即可。
第二种发送二进制数据的时候,我们采用了一种分片方式。因为数据通道在不同的浏览器中有具体数据长度的大小限制。
我们因此采用每次发送一小片的方式,多次发送,直到完成。
一般的,上述中的100*1024是我们的一个经验值,太小可能会有问题,因为发送次数太多,太大会丢包或奇怪的问题。
剩余内容需解锁后查看
Paragoger衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/6598