Delphi WebRTC 라이브러리 — P2P, ICE, STUN, TURN, DataChannel
WebRTC 피어-투-피어 스택의 네이티브 Pascal 구현: RTCPeerConnection, ICE 후보 수집 및 연결 검사, STUN 및 TURN 클라이언트 + 서버, DTLS-SRTP 키 합의 및 SCTP 데이터 채널 — WebSocket 시그널링이 이미 연결되어 있어요.
WebRTC 피어-투-피어 스택의 네이티브 Pascal 구현: RTCPeerConnection, ICE 후보 수집 및 연결 검사, STUN 및 TURN 클라이언트 + 서버, DTLS-SRTP 키 합의 및 SCTP 데이터 채널 — WebSocket 시그널링이 이미 연결되어 있어요.
Chromium을 번들로 묶지 않고 브라우저 등급 P2P를 Delphi에 가져오세요.
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가 생성하는 동일한 와이어 형식으로 오퍼를 생성하고, 앤서를 수락하고, ICE 후보를 트리클하세요.
전체 후보 수집: 호스트, 서버 리플렉시브(STUN으로 발견), 릴레이(TURN으로 할당). RFC 8445에 따른 페어링과 우선순위 지정, 연결 검사를 지원해요. ICE 페이지.
NAT 발견 및 킵얼라이브를 위한 독립형 STUN 클라이언트 및 STUN 서버. 두 줄의 Pascal로 자체 STUN 엔드포인트를 실행하세요.
릴레이 할당용 TURN 클라이언트 및 자체 호스팅용 TURN 서버. 장기 자격 증명, IPv4 + IPv6.
필수 WebRTC 키 합의 프로토콜. 동일한 ICE 협상 UDP 경로를 통한 DTLS 1.2 핸드셰이크, SRTP용 키 자료 내보내기.
WebRTC 미디어 전송을 통한 신뢰할 수 있는 / 신뢰할 수 없는, 순서가 있는 / 순서가 없는 메시지 — 임의의 애플리케이션 데이터를 피어-투-피어로 보내는 표준 방법.
번들된 TsgcWebSocketClient / TsgcWebSocketHTTPServer를 시그널링 채널로 사용하거나, 바로 쓸 수 있는 TsgcWSPClient_RTCPeerConnection과 TsgcWSPServer_RTCPeerConnection 프로토콜 쌍을 사용하세요. 모든 것을 하나의 라이브러리로 해결해요.
WebRTC는 시그널링 프로토콜을 정의하지 않아요 — 직접 준비해야 해요. 일반적인 선택은 세 가지 메시지 타입을 운반하는 WebSocket 채널이에요: offer(호출자의 SDP), answer(피호출자의 SDP), ice-candidate(양쪽에서 트리클되는 후보). sgcWebSockets에는 이미 그 채널의 양쪽 끝이 들어 있어요. TsgcWSPServer_RTCPeerConnection은 호출자와 피호출자를 짝지어 서로의 설명과 후보를 중계하고, TsgcWSPClient_RTCPeerConnection은 그에 맞는 클라이언트이며, TsgcWSPServer_WebRTC는 브라우저 피어를 상대로 같은 일을 하면서 접속하는 피어마다 ICE 서버 목록을 전달해요.
피어 연결 컴포넌트와 시그널링 서버가 동일한 라이브러리에 있기 때문에 단일 서드파티 SDK를 통합하지 않고도 완전한 WebRTC 애플리케이션 — 조정된 발견, NAT 통과, 암호화된 P2P 페이로드 — 을 구축할 수 있어요.
브라우저가 사용하는 것과 동일한 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)로 시작해요. 트래픽이 늘어나면 릴레이 대역폭 비용도 함께 늘어나요 — 실제로 WebRTC에서 바이트 단위로 비용을 내는 부분은 TURN뿐이에요. 이 라이브러리는 자체 호스팅을 지원해요: TsgcSTUNServer와 TsgcTURNServer는 콘솔 애플리케이션이나 Windows 서비스에 넣기만 하면 기본적으로 UDP 3478에서, 그리고 Bindings에 지정한 포트와 주소에서 응답해요. 장기 자격 증명, IPv4와 IPv6, TURNOptions.Allocation의 중계 포트 범위, 사용자별 할당량이 모두 내장되어 있어요.
모든 피어-투-피어 컴포넌트의 랜딩 페이지.
상세한 컴포넌트 참조.
후보 수집 및 연결 검사.
Delphi-to-Delphi 데이터 채널의 종단 간 워크스루.
Delphi에서 자체 STUN/TURN 인프라 자체 호스팅.
상호 운용성 테스트를 위해 참조 C 구현 교차 참조.