RTCPeerConnection: Methode createDataChannel()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.
Die Methode createDataChannel() der Schnittstelle RTCPeerConnection erstellt einen neuen Kanal, der mit dem Remote-Peer verknüpft ist und über den jede Art von Daten übertragen werden kann.
Dies kann für Back-Channel-Inhalte nützlich sein, etwa Bilder, Dateiübertragungen, Text-Chats, Spielaktualisierungspakete usw.
Wenn der neue Datenkanal der erste ist, der der Verbindung hinzugefügt wird, wird eine Neuverhandlung gestartet, indem ein negotiationneeded-Ereignis ausgelöst wird.
Sie können diese Neuverhandlung vermeiden, indem Sie alwaysNegotiateDataChannels im Konstruktor RTCPeerConnection() auf true setzen. Dadurch wird festgelegt, dass die Anwendung Datenkanäle im SDP-Angebot aushandelt, bevor sie einen RTCDataChannel erstellt. Dadurch müssen Sie vor Ihrem ersten Aufruf von createOffer() keinen Datenkanal erstellen und keine zweite Neuverhandlung akzeptieren.
Syntax
createDataChannel(label)
createDataChannel(label, options)
Parameter
label-
Ein für Menschen lesbarer Name für den Kanal. Diese Zeichenfolge darf nicht länger als 65.535 Byte sein.
optionsOptional-
Ein Objekt, das Konfigurationsoptionen für den Datenkanal bereitstellt. Es kann die folgenden Felder enthalten:
orderedOptional-
Gibt an, ob Nachrichten, die über den
RTCDataChannelgesendet werden, in derselben Reihenfolge an ihrem Ziel eintreffen müssen, in der sie gesendet wurden (true), oder ob sie in anderer Reihenfolge eintreffen dürfen (false). Standard:true. maxPacketLifeTimeOptional-
Die maximale Anzahl von Millisekunden, die Übertragungsversuche für eine Nachricht im unzuverlässigen Modus dauern dürfen. Obwohl dieser Wert eine vorzeichenlose 16-Bit-Zahl ist, kann jeder User-Agent ihn auf einen als angemessen erachteten Höchstwert begrenzen. Standard:
null. maxRetransmitsOptional-
Die maximale Anzahl von Versuchen, die der User-Agent unternehmen soll, um eine Nachricht erneut zu übertragen, deren erste Übertragung im unzuverlässigen Modus fehlgeschlagen ist. Obwohl dieser Wert eine vorzeichenlose 16-Bit-Zahl ist, kann jeder User-Agent ihn auf einen als angemessen erachteten Höchstwert begrenzen. Standard:
null. protocolOptional-
Der Name des Subprotokolls, das gegebenenfalls auf dem
RTCDataChannelverwendet wird; andernfalls die leere Zeichenfolge (""). Standard: leere Zeichenfolge (""). Diese Zeichenfolge darf nicht länger als 65.535 Byte sein. negotiatedOptional-
Standardmäßig (
false) werden Datenkanäle In-Band ausgehandelt, wobei eine SeitecreateDataChannelaufruft und die andere Seite mithilfe des Event-Handlersondatachannelauf das EreignisRTCDataChannelEventwartet. Alternativ (true) können sie Out-of-Band ausgehandelt werden, wobei beide SeitencreateDataChannelmit einer vereinbarten ID aufrufen. Standard:false. idOptional-
Eine numerische 16-Bit-ID für den Kanal; zulässige Werte sind 0 bis 65534. Wenn Sie diese Option nicht angeben, wählt der User-Agent eine ID für Sie aus.
Hinweis:
Diese Optionen stellen die per Skript festlegbare Teilmenge der Eigenschaften der Schnittstelle RTCDataChannel dar.
Rückgabewert
Ein neues RTCDataChannel-Objekt mit dem angegebenen label, das mithilfe der durch options angegebenen Optionen konfiguriert wird, falls dieser Parameter enthalten ist; andernfalls werden die oben aufgeführten Standardwerte festgelegt.
Ausnahmen
InvalidStateErrorDOMException-
Wird ausgelöst, wenn
RTCPeerConnectiongeschlossen ist. TypeError-
Wird in den folgenden Situationen ausgelöst:
- Die Zeichenfolge für Label und/oder Protokoll ist zu lang; diese dürfen nicht länger als 65.535 Byte sein (Byte statt Zeichen).
- Die
idist 65535. Obwohl dies ein gültiger vorzeichenloser 16-Bit-Wert ist, ist er kein zulässiger Wert fürid.
SyntaxErrorDOMException-
Wird ausgelöst, wenn für sowohl die Optionen
maxPacketLifeTimeals auchmaxRetransmitsWerte angegeben wurden. Sie dürfen nur für eine dieser Optionen einen Wert ungleichnullangeben. ResourceInUseDOMException-
Wird ausgelöst, wenn eine
idangegeben wurde, aber ein andererRTCDataChannelbereits denselben Wert verwendet. OperationErrorDOMException-
Wird ausgelöst, wenn entweder die angegebene
idbereits verwendet wird oder, falls keineidangegeben wurde, die WebRTC-Schicht keine ID automatisch generieren konnte, weil alle IDs verwendet werden.
Beispiele
Dieses Beispiel zeigt, wie ein Datenkanal erstellt und Handler für die Ereignisse open und message eingerichtet werden, um darüber Nachrichten zu senden und zu empfangen (der Kürze halber wird im Beispiel angenommen, dass onnegotiationneeded eingerichtet ist).
// Offerer side
const pc = new RTCPeerConnection(options);
const channel = pc.createDataChannel("chat");
channel.onopen = (event) => {
channel.send("Hi you!");
};
channel.onmessage = (event) => {
console.log(event.data);
};
// Answerer side
const pc = new RTCPeerConnection(options);
pc.ondatachannel = (event) => {
const channel = event.channel;
channel.onopen = (event) => {
channel.send("Hi back!");
};
channel.onmessage = (event) => {
console.log(event.data);
};
};
Alternativ kann eine symmetrischere Out-of-Band-Aushandlung mit einer vereinbarten ID verwendet werden (hier 0):
// Both sides
const pc = new RTCPeerConnection(options);
const channel = pc.createDataChannel("chat", { negotiated: true, id: 0 });
channel.onopen = (event) => {
channel.send("Hi!");
};
channel.onmessage = (event) => {
console.log(event.data);
};
Ein ausführlicheres Beispiel, das zeigt, wie die Verbindung und der Kanal hergestellt werden, finden Sie unter Ein einfaches RTCDataChannel-Beispiel.
Spezifikationen
| Spezifikation |
|---|
| WebRTC: Real-Time Communication in Browsers> # dom-peerconnection-createdatachannel> |