第三十二章 实际使用数据通道

基础建立DataChannel的步骤

DescriptionDetail
1SingalConnection类中创建DataChannelPeerConnection Create DataChannel
2SignalConnection实现了webrtc:PeerConnectionObserver有很多函数在OnDataChannel(rtc::scoped_refptr<webrtc:DataChannelInterface> InDataChannel)中 注册当前类为Observer InDataChannel→RegisterObserver(this);以便于后续消息函数等都可以在本类的实现中.
3SignalConnection实现了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是我们的一个经验值,太小可能会有问题,因为发送次数太多,太大会丢包或奇怪的问题。

剩余内容需解锁后查看

您需要付费解锁才能查看当前内容

VIP会员免费
已付费?登录刷新

Paragoger衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/6598

(0)
上一篇 2024-09-30 2:38 下午
下一篇 2024-09-30 2:39 下午

相关推荐

发表回复

登录后才能评论
本文授权以下站点有原版访问授权 https://www.shxcj.com https://www.2img.ai https://www.2video.cn