Delphi WebRTC 库——P2P、ICE、STUN、TURN、DataChannel

WebRTC 点对点栈的原生 Pascal 实现:RTCPeerConnection、ICE 候选收集与连通性检查、STUN 与 TURN 客户端 + 服务器、DTLS-SRTP 密钥协商以及 SCTP 数据通道——并且 WebSocket 信令已经接入。

面向 Pascal 的端到端点对点

为 Delphi 带来浏览器级别的 P2P——无需捆绑 Chromium。

Delphi WebRTC 库让两个 Delphi 进程(或一个 Delphi 进程与一个浏览器)建立直接的、穿越 NAT 的、端到端加密的通道,而无需通过中央服务器路由负载。sgcWebSockets 将每个 WebRTC 构建块都作为 Pascal 组件提供:TsgcWSPClient_WebRTC 镜像 JavaScript 的 RTCPeerConnection API,TsgcSTUNClient / TsgcSTUNServer 实现 RFC 5389,TsgcTURNClient / TsgcTURNServer 实现 RFC 5766,完整的 ICE 代理将它们绑定在一起。

与基于浏览器的栈(需要 Chromium 或 libwebrtc——数十兆原生代码和复杂的构建)不同,sgcWebSockets 的实现是基于 OpenSSL 的纯 Pascal,编译进您的二进制文件。它可在 Delphi 7 至 Delphi 13 上运行,并为 Win32/Win64、Linux64、macOS、iOS 和 Android 提供原生二进制文件。

对等连接

TsgcWSPClient_WebRTC

ICE / STUN / TURN

P2P 组件

标准

RFC 8825 / 5245 / 5389 / 5766 / 6347 / 4960

版本

Enterprise

每个 WebRTC 组件均已暴露

对等连接是头条,但支持部件也是一流的组件。

RTCPeerConnection

TsgcWSPClient_WebRTC 镜像 JavaScript API:CreateOfferCreateAnswerSetLocalDescriptionSetRemoteDescriptionAddIceCandidateCreateDataChannel。请参阅 RTCPeerConnection

SDP offer / answer

内置 SDP 序列化器和解析器。使用 Chrome 和 Firefox 产生的相同线格式生成 offer、接受 answer、trickle ICE 候选。

ICE 代理

完整的候选收集:主机、服务器自反(STUN 发现)、中继(TURN 分配)。按 RFC 5245 进行配对、优先级排序和连通性检查。ICE 页面

STUN 客户端 + 服务器

用于 NAT 发现和保持活动的独立 STUN 客户端STUN 服务器。用两行 Pascal 即可运行自己的 STUN 端点。

TURN 客户端 + 服务器

用于中继分配的 TURN 客户端和用于自托管的 TURN 服务器。长期凭据、IPv4 + IPv6。

DTLS-SRTP

强制性的 WebRTC 密钥协商协议。在相同的 ICE 协商 UDP 路径上进行 DTLS 1.2 握手,为 SRTP 导出密钥材料。

SCTP 数据通道

在 WebRTC 媒体传输上的可靠/不可靠、有序/无序消息——这是发送任意应用数据点对点的标准方式。

WebSocket 信令

使用捆绑的 TsgcWebSocketClient / TsgcWebSocketHTTPServer 作为信令通道——一个库搞定一切。

WebSocket 信令:标准模式

WebRTC 不定义信令协议——您需要自己提供。传统选择是一个携带三种消息类型的 WebSocket 通道:offer(来自呼叫者的 SDP)、answer(来自被呼叫者的 SDP)和 ice-candidate(任何一方 trickle 的候选)。sgcWebSockets 已经包含信令服务器的两端:TsgcWebSocketHTTPServer 带有一个 Channels 实现,可在匹配的对等方之间路由 JSON 消息。

由于对等连接组件和信令服务器存在于同一个库中,您可以建立一个完整的 WebRTC 应用程序——协调发现、NAT 穿越、加密的 P2P 负载——而无需集成单个第三方 SDK。

配置 ICE 服务器

浏览器使用的相同 IceServers 集合——同时支持公共服务器和您自己的私有 TURN。

uses
  sgcWebSocket, sgcWebSocket_Protocol_WebRTC_Client,
  sgcWebSocket_Protocol_WebRTC_Types;

var
  WSClient: TsgcWebSocketClient;
  RTC: TsgcWSPClient_WebRTC;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.URL := 'wss://signal.example.com/rtc';

  RTC := TsgcWSPClient_WebRTC.Create(nil);
  RTC.Client := WSClient;

  // Public Google STUN for NAT discovery
  RTC.IceServers.Add.URL := 'stun:stun.l.google.com:19302';

  // Your own TURN for relay when P2P fails
  with RTC.IceServers.Add do
  begin
    URL        := 'turn:turn.example.com:3478';
    UserName   := 'alice';
    Credential := 's3cret';
  end;

  RTC.OnDataChannelMessage := DoMessage;

  WSClient.Active := True;

  // Create a reliable, ordered data channel
  RTC.CreateDataChannel('chat', True, True);
  RTC.CreateOffer;
end;

procedure TForm1.DoMessage(Sender: TObject;
  const aChannel, aText: string);
begin
  Memo1.Lines.Add(aChannel + ': ' + aText);
end;

// Send a message peer-to-peer
RTC.SendDataChannelMessage('chat', 'Hello from Delphi');

在 Delphi 中运行自己的 STUN / TURN

大多数团队从公共的 Google STUN 和第三方 TURN 服务(Twilio、Xirsys、coturn)开始。当流量增长时,中继带宽账单也会增长——而实际上,TURN 是 WebRTC 中唯一按字节付费的部分。该库让您可以自托管:TsgcSTUNServerTsgcTURNServer 放入控制台应用程序或 Windows 服务中,在 UDP 3478 (STUN) 以及可配置端口的 TCP/UDP/TLS (TURN) 上提供协议服务。长期凭据、IPv4 和 IPv6 双栈、分配配额和每用户带宽限制都内置其中。

sgcWebSockets 中 P2P 的更多内容

P2P / WebRTC 中心

每个点对点组件的着陆页。

RTCPeerConnection

详细的组件参考。

ICE 代理

候选收集和连通性检查。

STUNTURN

NAT 发现和中继服务器。

博客:RTCPeerConnection P2P

Delphi 到 Delphi 数据通道的端到端演练。

博客:STUN + TURN 服务器与客户端

在 Delphi 中自托管您自己的 STUN/TURN 基础设施。

博客:Windows 上的 coturn

与参考 C 实现交叉引用以进行互操作性测试。

构建您的第一个 P2P 通道

下载试用版——WebRTC、STUN 和 TURN 演示以可编译的 Delphi 项目形式发布。