Golang Pions库使用示例
Golang Pions库使用示例 大家好!
我对Golang感到非常兴奋,想测试名为Pions库的Go语言WebRTC实现。 但在使用该库的示例时遇到了一些问题,无法让它正常工作…
我已经在Stackoverflow上发布了这个问题,但至今没有人回答…
有人能帮帮我吗?或者提供一个超级简单但能正常工作的代码示例? 有没有人已经测试过这个库?
目前我无法建立数据通道的连接,由于某些原因总是失败。
任何建议都将不胜感激!谢谢。
更多关于Golang Pions库使用示例的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang Pions库使用示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
以下是使用 Pions (现在已更名为 Pion) 库在 Go 中实现 WebRTC 数据通道的简单工作示例。这个示例创建了两个对等连接(PeerConnection),建立一个数据通道,并交换一条测试消息。确保你已经通过 go get github.com/pion/webrtc/v3 安装了 Pion WebRTC 库(版本 3 或更高)。
代码示例
这个示例使用内存中的信号传输(通过 Go 通道模拟),在实际应用中,你需要通过网络(如 WebSocket)在客户端之间交换信令数据(offer、answer、ICE candidate)。代码分为两部分:一个对等端创建 offer,另一个创建 answer。
package main
import (
"fmt"
"log"
"time"
"github.com/pion/webrtc/v3"
)
func main() {
// 配置 WebRTC 对等连接
config := webrtc.Configuration{
ICEServers: []webrtc.ICEServer{
{
URLs: []string{"stun:stun.l.google.com:19302"},
},
},
}
// 创建第一个对等连接(offerer)
peerConnection1, err := webrtc.NewPeerConnection(config)
if err != nil {
log.Fatal(err)
}
defer func() {
if closeErr := peerConnection1.Close(); closeErr != nil {
log.Fatal(closeErr)
}
}()
// 创建第二个对等连接(answerer)
peerConnection2, err := webrtc.NewPeerConnection(config)
if err != nil {
log.Fatal(err)
}
defer func() {
if closeErr := peerConnection2.Close(); closeErr != nil {
log.Fatal(closeErr)
}
}()
// 设置对等连接 1 的数据通道处理
peerConnection1.OnDataChannel(func(d *webrtc.DataChannel) {
fmt.Printf("对等连接 1 收到数据通道: %s\n", d.Label())
d.OnMessage(func(msg webrtc.DataChannelMessage) {
fmt.Printf("对等连接 1 收到消息: %s\n", string(msg.Data))
})
})
// 在对等连接 1 上创建数据通道
dataChannel, err := peerConnection1.CreateDataChannel("test-channel", nil)
if err != nil {
log.Fatal(err)
}
dataChannel.OnOpen(func() {
fmt.Println("数据通道打开,从对等连接 1 发送消息")
err := dataChannel.SendText("Hello from Peer 1!")
if err != nil {
log.Fatal(err)
}
})
// 设置对等连接 2 的数据通道处理
peerConnection2.OnDataChannel(func(d *webrtc.DataChannel) {
fmt.Printf("对等连接 2 收到数据通道: %s\n", d.Label())
d.OnOpen(func() {
fmt.Println("数据通道打开,从对等连接 2 发送消息")
err := d.SendText("Hello from Peer 2!")
if err != nil {
log.Fatal(err)
}
})
d.OnMessage(func(msg webrtc.DataChannelMessage) {
fmt.Printf("对等连接 2 收到消息: %s\n", string(msg.Data))
})
})
// 创建 offer 并设置本地描述
offer, err := peerConnection1.CreateOffer(nil)
if err != nil {
log.Fatal(err)
}
err = peerConnection1.SetLocalDescription(offer)
if err != nil {
log.Fatal(err)
}
// 将 offer 传递给对等连接 2 并设置远程描述
err = peerConnection2.SetRemoteDescription(offer)
if err != nil {
log.Fatal(err)
}
// 创建 answer 并设置本地描述
answer, err := peerConnection2.CreateAnswer(nil)
if err != nil {
log.Fatal(err)
}
err = peerConnection2.SetLocalDescription(answer)
if err != nil {
log.Fatal(err)
}
// 将 answer 传递给对等连接 1 并设置远程描述
err = peerConnection1.SetRemoteDescription(answer)
if err != nil {
log.Fatal(err)
}
// 收集并交换 ICE candidate(简化处理)
peerConnection1.OnICECandidate(func(c *webrtc.ICECandidate) {
if c == nil {
return
}
err := peerConnection2.AddICECandidate(c.ToJSON())
if err != nil {
log.Fatal(err)
}
})
peerConnection2.OnICECandidate(func(c *webrtc.ICECandidate) {
if c == nil {
return
}
err := peerConnection1.AddICECandidate(c.ToJSON())
if err != nil {
log.Fatal(err)
}
})
// 等待连接建立和数据交换
fmt.Println("等待数据通道通信...")
time.Sleep(5 * time.Second) // 在实际应用中,使用更可靠的同步方式
fmt.Println("示例完成")
}
运行说明
- 保存代码到文件(如
main.go)。 - 运行
go mod init example初始化模块(如果尚未初始化)。 - 运行
go get github.com/pion/webrtc/v3获取 Pion 库。 - 执行
go run main.go。
预期输出
运行后,你应该看到类似以下的输出,表明数据通道已成功建立并交换了消息:
等待数据通道通信...
对等连接 2 收到数据通道: test-channel
数据通道打开,从对等连接 2 发送消息
对等连接 1 收到消息: Hello from Peer 2!
数据通道打开,从对等连接 1 发送消息
对等连接 2 收到消息: Hello from Peer 1!
示例完成
常见问题解决
- 如果遇到 ICE candidate 错误,确保 STUN 服务器 URL 正确(示例中使用的是 Google 公共 STUN 服务器)。
- 在真实网络中,你需要实现信令服务器来交换 SDP 和 ICE candidate(示例中通过内存直接交换)。
- 检查防火墙或网络设置,确保允许 UDP 流量用于 WebRTC。
这个示例基于 Pion WebRTC v3 库,如果你使用旧版本,API 可能有所不同。参考 Pion 官方文档 获取更多细节。

