WebTransport是浏览器提供的新一代网络传输API,基于QUIC协议实现,支持多种流传输模式,能够在js中完成低延迟、高可靠性的数据交互,弥补了传统传输方式在复杂场景下的不足。

WebTransport基础准备
在使用WebTransport之前,需要确认浏览器支持情况,目前Chrome、Edge等主流浏览器已经实现了相关API。同时服务端需要部署支持QUIC协议的WebTransport服务,客户端通过指定URL建立连接。
首先需要在js中创建WebTransport实例并启动连接,基础连接代码如下:
// 创建WebTransport连接实例,注意将ippipp.com替换为实际的服务端地址
const transport = new WebTransport('https://ipipp.com:8080/webtransport');
// 启动连接
await transport.ready;
console.log('WebTransport连接已建立');
3种流传输技术操作实现
1. 单向流操作
单向流是只支持单向数据传输的流,分为发送单向流和接收单向流,适合只需要单向传递数据的场景,比如客户端向服务端上报日志,或者服务端向客户端推送通知。
客户端创建发送单向流并写入数据的代码如下:
// 创建发送单向流
const sendStream = await transport.createSendStream();
// 获取写入器
const writer = sendStream.getWriter();
// 写入数据,这里写入字符串需要转成Uint8Array
const encoder = new TextEncoder();
const data = encoder.encode('这是单向流发送的数据');
await writer.write(data);
// 关闭流
await writer.close();
接收服务端发送的单向流数据代码如下:
// 监听接收单向流
for await (const receiveStream of transport.receiveStreams()) {
const reader = receiveStream.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
console.log('收到单向流数据:', decoder.decode(value));
}
}
2. 双向流操作
双向流支持同时收发数据,适合需要交互通信的场景,比如实时聊天、指令交互等,客户端和服务端可以在同一个流上同时读写数据。
客户端创建双向流并交互数据的代码如下:
// 创建双向流
const bidirectionalStream = await transport.createBidirectionalStream();
// 获取读取器和写入器
const reader = bidirectionalStream.readable.getReader();
const writer = bidirectionalStream.writable.getWriter();
const encoder = new TextEncoder();
const decoder = new TextDecoder();
// 发送数据
await writer.write(encoder.encode('双向流发送的消息'));
// 接收数据
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
console.log('双向流收到回复:', decoder.decode(value));
}
// 关闭流
await writer.close();
3. Datagram流操作
Datagram流是基于UDP的无序、不可靠传输流,延迟极低,适合对实时性要求高、可以容忍少量丢包的场景,比如实时音视频传输、游戏状态同步等。
Datagram流的读写操作代码如下:
// 获取Datagram的写入器和读取器
const datagramWriter = transport.datagrams.writable.getWriter();
const datagramReader = transport.datagrams.readable.getReader();
const encoder = new TextEncoder();
const decoder = new TextDecoder();
// 发送Datagram数据
await datagramWriter.write(encoder.encode('Datagram发送的低延迟数据'));
// 接收Datagram数据
while (true) {
const { done, value } = await datagramReader.read();
if (done) {
break;
}
console.log('收到Datagram数据:', decoder.decode(value));
}
不同流技术的对比
三种流传输技术的特点和适用场景如下:
| 流类型 | 传输方向 | 可靠性 | 延迟 | 适用场景 |
|---|---|---|---|---|
| 单向流 | 单向 | 可靠 | 中等 | 日志上报、服务端推送通知 |
| 双向流 | 双向 | 可靠 | 中等 | 实时聊天、指令交互 |
| Datagram流 | 双向 | 不可靠 | 极低 | 实时音视频、游戏同步 |
连接关闭与错误处理
使用完WebTransport后需要正确关闭连接,同时做好错误捕获,避免资源泄漏。
关闭连接和错误处理的代码如下:
// 监听连接关闭事件
transport.closed.then(() => {
console.log('WebTransport连接已关闭');
}).catch((error) => {
console.error('WebTransport连接发生错误:', error);
});
// 主动关闭连接
transport.close();
在实际使用中,需要根据业务场景选择合适的流类型,单向流适合简单单向传输,双向流适合交互场景,Datagram流适合低延迟要求高的场景,合理搭配使用可以最大化WebTransport的传输效率。
WebTransportjs流操作quic协议单向流双向流修改时间:2026-06-13 08:06:25