新闻中心

Golang TCP 客户端如何发送文件_Golang 网络 I/O 与数据分块实践

2025-11-16
浏览次数:
返回列表
答案是通过分块读写实现高效文件传输。使用 net.Dial 建立 TCP 连接,os.Open 打开文件,利用固定缓冲区(如 32KB)循环读取并发送数据,避免内存溢出;可通过 io.Copy 简化传输,并先发送文件名和大小等元信息以供校验,确保完整性。

golang tcp 客户端如何发送文件_golang 网络 i/o 与数据分块实践

在 Golang 中通过 TCP 发送文件,核心在于建立稳定的连接、分块读取文件内容并逐段发送,避免内存溢出和网络阻塞。关键不是一次性把整个文件加载进内存,而是边读边发,配合合理的缓冲区大小控制传输效率。

建立 TCP 连接并准备文件

使用 net.Dial 连接到指定的服务器地址。确保目标服务端已监听对应端口。接着用 os.Open 打开本地文件,获取可读的文件句柄。

示例代码:

conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
    log.Fatal(err)
}
defer conn.Close()

file, err := os.Open("example.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

使用缓冲区进行数据分块发送

大文件必须分块处理。定义一个固定大小的缓冲区(如 4KB 或 32KB),循环从文件中读取数据并写入 TCP 连接。这种方式对内存友好,适合任意大小的文件。

典型做法:

  • 创建 buffer := make([]byte, 32*1024) 作为读取缓存
  • 在 for 循环中调用 file.Read(buffer)
  • 每次读到的数据立即通过 conn.Write(data) 发送
  • 直到返回 io.EOF 表示文件结束
buf := make([]byte, 32*1024)
for {
    n, err := file.Read(buf)
    if n > 0 {
        _, werr := conn.Write(buf[:n])
        if werr != nil {
            log.Fatal(werr)
        }
    }
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
}

优化:携带文件元信息并校验完整性

实际应用中,建议先发送文件名、大小等元数据,让接收方做好准备。可以使用简单的格式如 JSON 或自定义协议头。

Zyro AI Background Remover Zyro AI Background Remover

Zyro推出的AI图片背景移除工具

Zyro AI Background Remover 145 查看详情 Zyro AI Background Remover

例如:

info := fmt.Sprintf("%s|%d", filepath.Base(file.Name()), fileInfo.Size())
conn.Write([]byte(info + "\n"))

接收端解析该行后,知道接下来要收多少字节,便于分配资源或校验是否完整接收。

基本上就这些。分块读写是网络传输的基础模式,Golang 的 io.Copy 其实也能简化这个过程:

io.Copy(conn, file) // 自动按内部缓冲高效传输

只要注意连接生命周期和错误处理,就能稳定发送文件。不复杂但容易忽略细节。

以上就是Golang TCP 客户端如何发送文件_Golang 网络 I/O 与数据分块实践的详细内容,更多请关注其它相关文章!


# json  # go  # js  # 牟平网站优化  # 河池企业网站建设  # seo网站优化排名推广方案  # 网站建设介绍的ppt  # 广东建设行业网站  # 优化好的网站免费  # 合肥建设网站排名  # 玉溪个性化网站建设  # 兰州网站建设与设计公司  # 华润营销渠道如何推广  # 自定义  # 中文网  # 相关文章  # 也能  # 如何在  # 句柄  # 就能  # 资源管理  # 客户端  # 加载  # 端口  # 字节  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  QQ官网正版登录链接 QQ在线登录入口最新  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  必由学官方登录入口 必由学教师学生账号快速访问  必由学官网快捷入口 必由学网页版在线学习平台  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  C++指针和引用有什么区别_C++内存管理核心概念深度解析  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  解决Tabulator日期时间排序问题的专业指南  如何在 Windows 11 中启动游戏手柄设置  期待已久:小米17 Ultra、小米首款NAS本月登场  AO3最新可访问网址 Archive of Our Own官方在线入口  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  可靠CSGO开箱平台解析 CSGO开箱网合集  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  yandex入口引擎手机版 yandex安卓版下载入口  零跑汽车11月交付量达70327台 实现连续9个月正增长  《噬血代码2》新预告片发布 展示游戏剧情  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  Pyrogram与g4f集成:异步编程实践与常见错误解决  cad如何更改注释性对象的比例_cad注释性比例调整方法  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  优化Log4j2控制台输出性能:解决异步日志瓶颈  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  C++如何比较两个字符串_C++ string compare函数与操作符对比  C++ vector二维数组定义_C++ vector of vector用法  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  怎么在mac上运行html代码_mac运行html代码方法【指南】  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  126邮箱网页版官方入口 126邮箱账号在线登录平台  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  J*aScript数据结构转换:将对象数组按类别分组 

搜索