为 Delphi 带来浏览器级别的 P2P——无需捆绑 Chromium。
Delphi WebRTC 库让两个 Delphi 进程(或一个 Delphi 进程与一个浏览器)建立直接的、穿越 NAT 的、端到端加密的通道,而无需通过中央服务器路由负载。sgcWebSockets 将每个 WebRTC 构建块都作为 Pascal 组件提供:TsgcRTCPeerConnection 镜像 W3C 的 RTCPeerConnection API,TsgcSTUNClient / TsgcSTUNServer 实现 RFC 8489,TsgcTURNClient / TsgcTURNServer 实现 RFC 8656,而完整的 ICE 代理 TsgcICEClient 将它们绑定在一起。
与基于浏览器的栈(需要 Chromium 或 libwebrtc——数十兆原生代码和复杂的构建)不同,sgcWebSockets 的实现是基于 OpenSSL 的纯 Pascal,编译进您的二进制文件。它可在 Delphi 7 至 Delphi 13 上运行,并为 Win32/Win64、Linux64、macOS、iOS 和 Android 提供原生二进制文件。
TsgcRTCPeerConnection
RFC 8825 / 8445 / 8489 / 8656 / 6347 / 4960 / 8831
组件需要 Enterprise,offer 与 answer、DataChannels 和轨道则需要 sgcWebRTC 附加包。两者均包含在 All-Access 中。
对等连接是头条,但支持部件也是一流的组件。
TsgcRTCPeerConnection 镜像 W3C API:CreateOffer、CreateAnswer、SetLocalDescription、SetRemoteDescription、AddIceCandidate、CreateDataChannel、AddTrack。请参阅 RTCPeerConnection。
内置 SDP 序列化器和解析器。使用 Chrome 和 Firefox 产生的相同线格式生成 offer、接受 answer、trickle ICE 候选。
完整的候选收集:主机、服务器自反(STUN 发现)、中继(TURN 分配)。按 RFC 8445 进行配对、优先级排序和连通性检查。ICE 页面。
强制性的 WebRTC 密钥协商协议。在相同的 ICE 协商 UDP 路径上进行 DTLS 1.2 握手,为 SRTP 导出密钥材料。
在 WebRTC 媒体传输上的可靠/不可靠、有序/无序消息——这是发送任意应用数据点对点的标准方式。
使用捆绑的 TsgcWebSocketClient / TsgcWebSocketHTTPServer 作为您的信令通道,或使用现成的 TsgcWSPClient_RTCPeerConnection 与 TsgcWSPServer_RTCPeerConnection 协议组件对。一个库搞定一切。
WebRTC 不定义信令协议 — 您需要自己提供。传统选择是一个携带三种消息类型的 WebSocket 通道:offer(来自呼叫者的 SDP)、answer(来自被呼叫者的 SDP)和 ice-candidate(任何一方 trickle 的候选)。sgcWebSockets 已经包含该通道的两端。TsgcWSPServer_RTCPeerConnection 将呼叫者与被呼叫者配对,并转发双方的描述和候选,TsgcWSPClient_RTCPeerConnection 是与之配套的客户端,而 TsgcWSPServer_WebRTC 为浏览器对等方完成同样的工作,并在每个对等方加入时向其推送 ICE 服务器列表。
由于对等连接组件和信令服务器存在于同一个库中,您可以建立一个完整的 WebRTC 应用程序——协调发现、NAT 穿越、加密的 P2P 负载——而无需集成单个第三方 SDK。
与浏览器使用的那份 iceServers 列表完全相同,以 RTCOptions.ICEServers 的形式暴露 — 既可使用公共服务器,也可使用您自己的私有 TURN。
uses
sgcP2P, sgcP2P_DataChannel;
// TFormPeer 持有 FPeer、FChannel 和 FIncoming: TStringList
procedure TFormPeer.CreatePeer;
begin
FPeer := TsgcRTCPeerConnection.Create(nil);
FPeer.RTCOptions.ICEServers.AddURL('stun:stun.l.google.com:19302');
FPeer.RTCOptions.ICEServers.AddURL('turn:turn.example.com:3478',
'alice', 's3cret');
FPeer.OnLocalDescription := OnLocalDescription;
FPeer.OnIceCandidate := OnIceCandidate;
FPeer.OnDataChannel := OnDataChannel;
// 出站一方。CreateDataChannel 会开启 RTCOptions.DTLS
FChannel := FPeer.CreateDataChannel('chat');
FChannel.OnMessage := OnChannelMessage;
FPeer.CreateOffer;
end;
procedure TFormPeer.OnLocalDescription(Sender: TObject;
const aType, aSDP: string);
begin
// aType 为 'offer' 或 'answer'
SignalToPeer(aType, aSDP);
end;
procedure TFormPeer.OnIceCandidate(Sender: TObject;
const aCandidate, aSdpMid: string; aSdpMLineIndex: Integer);
begin
SignalCandidate(aCandidate, aSdpMid, aSdpMLineIndex);
end;
procedure TFormPeer.OnDataChannel(Sender: TObject;
aChannel: TsgcRTCDataChannel);
begin
FChannel := aChannel;
FChannel.OnMessage := OnChannelMessage;
end;
procedure TFormPeer.OnChannelMessage(Sender: TObject;
const aText: string);
begin
// 在工作线程上触发,操作控件前请先编组
FIncoming.Add(aText);
end;
// 点对点发送消息
FChannel.Send('Hello from Delphi');
大多数团队从公共的 Google STUN 和第三方 TURN 服务(Twilio、Xirsys、coturn)开始。当流量增长时,中继带宽账单也会随之增长 — 而实际上,TURN 是 WebRTC 中唯一按字节付费的部分。该库让您可以自托管:TsgcSTUNServer 和 TsgcTURNServer 可放入控制台应用程序或 Windows 服务中,默认在 UDP 3478 上响应,也可使用您在 Bindings 中填写的任意端口和地址。长期凭据、IPv4 与 IPv6、TURNOptions.Allocation 中的中继端口范围以及每用户分配配额都已内置。
每个点对点组件的着陆页。
详细的组件参考。
候选收集和连通性检查。
Delphi 到 Delphi 数据通道的端到端演练。
在 Delphi 中自托管您自己的 STUN/TURN 基础设施。
与参考 C 实现交叉引用以进行互操作性测试。