如何在Deno TCP服务中实现动态大小的Uint8Array接收数据?
解决Deno TCP连接动态读取数据的问题
你可以通过两种方式实现动态获取Uint8Array,无需手动指定缓冲区大小或处理返回长度切片:
方法一:使用Deno.readAll()(推荐,简洁高效)
Deno.readAll()会自动读取连接中的所有可用数据,返回一个适配数据大小的Uint8Array,完全不需要手动管理缓冲区:
const server = Deno.listen({ port: 3000 }); for await (const conn of server) { try { // 自动读取全部数据,返回动态大小的Uint8Array const data = await Deno.readAll(conn); console.log(data); } finally { // 确保连接关闭,避免资源泄漏 conn.close(); } }
方法二:流式拼接数据(适合大文件/分段传输场景)
如果需要处理分段发送的流式数据,可以将连接转为ReadableStream,通过循环读取并拼接数据来构建动态数组:
const server = Deno.listen({ port: 3000 }); for await (const conn of server) { let allData = new Uint8Array(); const reader = conn.readable.getReader(); try { while (true) { const { done, value } = await reader.read(); if (done) break; // 扩容并拼接新读取的数据 const tempBuffer = new Uint8Array(allData.length + value.length); tempBuffer.set(allData); tempBuffer.set(value, allData.length); allData = tempBuffer; } console.log(allData); } finally { reader.releaseLock(); conn.close(); } }
注意事项
Deno.readAll()会一直等待直到连接关闭,适合一次性传输完整数据的场景。- 流式处理方式可以在数据传输过程中逐步处理,避免一次性加载大量数据到内存,适合大体积数据场景。
内容的提问来源于stack exchange,提问作者thebluetropics
相关产品推荐
相关产品推荐

