Signatur
Beschreibung
bytesSent ist eine schreibgeschützte Eigenschaft des Dictionaries RTCDataChannelStats. Ein solcher Statistikeintrag hat den type "data-channel" und steht im RTCStatsReport, den RTCPeerConnection.getStats() zurückgibt. Der Wert zählt die Nutzlast-Bytes aller Nachrichten, die über den Kanal gesendet wurden. Header von SCTP, DTLS, UDP und IP werden nicht mitgezählt.
Mit der Eigenschaft lässt sich das Datenvolumen eines einzelnen Datenkanals messen, etwa für Dateiübertragungen, Spiel-Synchronisation oder Chat-Anwendungen. Fragt man die Statistik regelmäßig ab und vergleicht zwei Werte samt ihren timestamp-Angaben, erhält man den Durchsatz in Bytes pro Sekunde. Zusammen mit messagesSent ergibt sich außerdem die durchschnittliche Nachrichtengröße.
Der Zähler wächst monoton, solange der Kanal existiert. Ein Wert wird nur für Nachrichten erfasst, die wirklich an die Transportschicht übergeben wurden. Daten, die noch im Sendepuffer stehen (siehe RTCDataChannel.bufferedAmount), sind darin eventuell noch nicht enthalten.
Rückgabewert
unsigned long long): die Summe der bisher gesendeten Nutzlast-Bytes auf diesem Datenkanal. Fehlt der Wert in der Implementierung, ist die Eigenschaft undefined.Beispiele
Gesendete 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}" (id ${stats.dataChannelIdentifier}): ${stats.bytesSent} Bytes gesendet`);
}
});
};
// Nutzung mit einer bestehenden, verbundenen RTCPeerConnection
await logDataChannelBytes(peerConnection);
Sende-Durchsatz eines Kanals messen
const findChannelStats = async (pc, label) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'data-channel' && stats.label === label) return stats;
}
return null;
};
let previous = null;
const timer = setInterval(async () => {
const current = await findChannelStats(peerConnection, 'file-transfer');
if (!current) return;
if (previous) {
const bytes = current.bytesSent - previous.bytesSent;
const seconds = (current.timestamp - previous.timestamp) / 1000;
console.log(`Durchsatz: ${(bytes / seconds / 1024).toFixed(1)} KiB/s`);
}
previous = current;
}, 1000);
// Später: clearInterval(timer);
Durchschnittliche Nachrichtengröße berechnen
const averageMessageSize = async (pc) => {
const report = await pc.getStats();
const result = {};
report.forEach((s) => {
if (s.type === 'data-channel' && s.messagesSent > 0) {
result[s.label] = Math.round(s.bytesSent / s.messagesSent);
}
});
return result;
};
console.log(await averageMessageSize(peerConnection));
// Wichtig · Fallstricke
- Nur Nutzlast: Protokoll-Overhead durch SCTP, DTLS, UDP und IP ist nicht enthalten. Für den gesamten Netzwerkverkehr nutzt man
RTCTransportStats.bytesSentoderRTCIceCandidatePairStats.bytesSent. - Kodierung von Zeichenketten: Texte, die mit
send()verschickt werden, zählen in UTF-8-Bytes, nicht in Zeichen. Umlaute und Emojis belegen daher mehrere Bytes. - Snapshot-Charakter: Das Statistikobjekt ist eine Momentaufnahme und aktualisiert sich nicht von selbst. Man muss
getStats()erneut aufrufen. - Zuordnung: Man sollte Kanäle über
dataChannelIdentifieroderlabelzuordnen. Die Statistik-idist browserspezifisch und kann sich zwischen Implementierungen unterscheiden. - Kompatibilität: Wird in allen modernen Browsern unterstützt. Ältere Versionen liefern die Eigenschaft eventuell nicht. Vor Berechnungen sollte man deshalb auf
undefinedprüfen. - Nach dem Schließen: Wenn ein Kanal geschlossen ist (
state: "closed"), kann sein Statistikeintrag aus späteren Berichten verschwinden.