webrtc 的datachannel在golang中的使用
因为在发送端需要接收一些接收端的统计信息,而且具有不可丢失的需求,所以采取利用datachannel进行传输。datachannel是基于sctp协议的传输通道,sctp可提供按需可靠到达的服务,在datachannel中可以设置是否按序,是否可靠,最大重传次数,数据最大保存时间(当数据超过保存时间仍未发出时将被丢弃)。默认按序可靠传输,并进行带内协商。
带内协商意味着在datachannel的发起方创建datachannel,当接收方监听到datachannel时获取datachannel句柄。具体而言,在sender端,利用Dc:=webrtc.peerconnection.CreateDataChannel("states", &webrtc.DataChannelInit{})
创建datachannel对象,"states"为我们的自定义Label,&webrtc.DataChannelInit{}为默认设置。
创建完成后有一些事件:OnMessage,OnDataChannel,OnOpen等,这三个是我在程序中采用的。其中OnMessage负责在需要接收消息的一端进行收听所需消息(无论是发起者还是收听者都可能会需要接收消息,两端都可以用OnMessage),OnDataChannel在接收端进行监听DataChannel,文档中这样描述它: OnDataChannel sets an event handler which is invoked when a** data channel message** arrives from a remote peer.另外我们需要注意在OnMessage的描述中为 OnMessage sets an event handler which is invoked on a binary message arrival over the sctp transport from a remote peer. OnMessage can currently receive messages up to 16384 bytes in size. Check out the detach API if you want to use larger message sizes. Note that browser support for larger messages is also limited.两者从说明上来看是有区别的。另外要注意一点OnMessage说明是a binary message arrival,但实际上我们在数据通道中还支持发送字符串,不过我为了避免麻烦并没有去尝试Dc.Sendtxt()
函数,有兴趣的读者可以进行尝试。在接收端中, OnDataChannel的调用为peerConnection.OnDataChannel(func(dc *webrtc.DataChannel) {your function})
获取到datachannel对象dc,并在your function中对dc进行操作,比如读取,发送,关闭。发送示例:
peerConnection.OnDataChannel(func(dc *webrtc.DataChannel) {
// Register channel opening handling
dc.OnOpen(func() {
for {
buf := make([]byte, 4)
mutex.Lock()
binary.LittleEndian.PutUint32(buf, uint32(value))
err := dc.Send(buf)
if err != nil {
print(err)
}
mutex.Unlock()
time.Sleep(1000 * time.Millisecond)
}
})
})
在另一端进行接收利用
Dc.OnMessage(func(msg webrtc.DataChannelMessage) {
fmt.Println(msg.Data)
println(len(msg.Data))
bufBinary := bytes.NewBuffer(msg.Data)
binary.Read(bufBinary, binary.LittleEndian, &buffer)
println("buffer time", buffer)
})
OnOpen个人猜测只要底层的datachannel没断开就会一直处于调用状态。
接下来推荐一个看到的比较简洁的示例https://gist.github.com/enobufs/7d8e2996022658b31c04019afac91393
另外要注意到一点的是,datachannel的调用不能在webrtc的OnTrack事件中进行,OnTrack用于接收远程的track传来的流。也就是说peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {peerConnection.OnDataChannel(func(dc *webrtc.DataChannel) {}}是不行的,虽然不会报错但是会发现无法接收datachannel上的数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix