Signatur
Beschreibung
Die schreibgeschützte Eigenschaft bytesReceived des Wörterbuchs RTCDataChannelStats enthält die Gesamtzahl der Nutzdaten-Bytes, die auf einem bestimmten RTCDataChannel empfangen wurden. Gezählt werden nur die Bytes der eigentlichen Nachrichten: Header, Auffüllbytes (Padding) sowie SCTP-, DTLS- und UDP-Overhead fließen nicht ein.
Einen RTCDataChannelStats-Eintrag bekommst du über RTCPeerConnection.getStats(). Der zurückgegebene RTCStatsReport ist eine Map-artige Struktur; die Einträge mit type === "data-channel" beschreiben jeweils einen Datenkanal. Mit label und dataChannelIdentifier ordnest du den Eintrag dem richtigen Kanal zu.
Typische Einsatzzwecke sind Diagnose-Oberflächen, Bandbreitenmessung (Durchsatz aus der Differenz zweier Messungen, geteilt durch die Zeitdifferenz über timestamp) und Fortschrittsanzeigen bei Dateiübertragungen per WebRTC. Zusammen mit messagesReceived lässt sich außerdem die durchschnittliche Nachrichtengröße berechnen.
Rückgabewert
unsigned long long): die kumulierte Anzahl empfangener Nutzdaten-Bytes seit dem Öffnen des Kanals. Fehlt die Eigenschaft im Statistik-Objekt, ist der Wert undefined.Beispiele
Empfangene Bytes aller Datenkanäle auslesen
const logDataChannelBytes = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'data-channel') {
console.log(`Kanal "${stats.label}": ${stats.bytesReceived ?? 0} Bytes empfangen`);
}
});
};
// pc ist eine bestehende, verbundene RTCPeerConnection
await logDataChannelBytes(pc);
Empfangs-Durchsatz periodisch messen
const monitorThroughput = (pc, label, intervalMs = 1000) => {
let last = null;
return setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'data-channel' || stats.label !== label) continue;
if (last) {
const bytes = stats.bytesReceived - last.bytesReceived;
const seconds = (stats.timestamp - last.timestamp) / 1000;
console.log(`${label}: ${(bytes / seconds / 1024).toFixed(1)} KiB/s`);
}
last = stats;
}
}, intervalMs);
};
const timerId = monitorThroughput(pc, 'dateiuebertragung');
// Später beenden: clearInterval(timerId);
Fortschritt einer Dateiübertragung anzeigen
const expectedSize = 5 * 1024 * 1024; // vom Sender angekündigte Dateigröße
const showProgress = async (pc, label) => {
const report = await pc.getStats();
const stats = [...report.values()].find(
(s) => s.type === 'data-channel' && s.label === label
);
if (!stats) return;
const percent = Math.min(100, (stats.bytesReceived / expectedSize) * 100);
console.log(`Fortschritt: ${percent.toFixed(0)} %`);
};
await showProgress(pc, 'datei');
// Wichtig · Fallstricke
- Nur Nutzdaten: Protokoll-Overhead (SCTP, DTLS, UDP, IP) wird nicht gezählt. Für den tatsächlichen Netzwerkverkehr musst du die Statistiken vom Typ
transportodercandidate-pairauswerten. - Kumulativer Zähler: Der Wert steigt nur an. Für einen Durchsatz immer die Differenz zweier Messungen bilden und durch die Differenz ihrer
timestamp-Werte teilen. - Kanal eindeutig zuordnen: Mehrere Kanäle können dasselbe
labelhaben. Wenn du ganz sicher gehen willst, vergleichedataChannelIdentifiermitRTCDataChannel.id. - Geschlossene Kanäle: Je nach Browser taucht ein geschlossener Kanal nicht mehr im Bericht auf. Wichtige Werte deshalb vorher sichern.
- Kompatibilität: Wird in allen aktuellen Browsern mit WebRTC-Unterstützung angeboten. In älteren Versionen kann die Eigenschaft fehlen, daher mit
?? 0absichern. Außerdem istgetStats()asynchron und sollte nicht zu oft aufgerufen werden (etwa einmal pro Sekunde reicht meist).