You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.5 KiB

文件大小限制说明

为什么有文件大小限制?

WebSocket 协议虽然支持传输大文件,但在实际应用中会遇到以下问题:

  1. 浏览器内存限制 - 大文件的 base64 编码会占用大量内存
  2. 网络稳定性 - 大文件传输时间长,容易因网络波动而失败
  3. 用户体验 - 传输大文件会阻塞其他消息,影响聊天体验
  4. 服务器负载 - 多个用户同时传输大文件会导致服务器压力过大

文件大小限制

Web 客户端

文件类型 推荐大小 最大限制 说明
图片 < 500KB 2MB 建议压缩后发送
视频 < 1MB 2MB 建议发送短视频或压缩
音频 < 1MB 2MB 建议使用压缩格式MP3
语音消息 < 500KB 2MB 录制时长建议 < 30秒
其他文件 < 1MB 2MB 文档、压缩包等

重要提示:

  • Base64 编码会使文件大小增加约 33%
  • 实际传输大小 = 原文件大小 × 1.33
  • 例如1.5MB 的文件编码后约 2MB

TCP 客户端(命令行)

文件类型 推荐大小 最大限制 说明
任意文件 < 50MB 100MB 受 JVM 内存限制

如何压缩文件

压缩图片

在线工具

命令行工具

# 使用 ImageMagick 压缩图片
magick convert input.jpg -quality 85 -resize 1920x1080 output.jpg

# 使用 pngquant 压缩 PNG
pngquant --quality=65-80 input.png --output output.png

压缩视频

在线工具

命令行工具

# 使用 ffmpeg 压缩视频
ffmpeg -i input.mp4 -vcodec h264 -acodec aac -b:v 1000k output.mp4

# 压缩并调整分辨率
ffmpeg -i input.mp4 -vf scale=1280:720 -b:v 800k output.mp4

# 压缩为 WebM 格式(更小)
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 500k output.webm

压缩音频

在线工具

命令行工具

# 使用 ffmpeg 压缩音频
ffmpeg -i input.wav -c:a libmp3lame -b:a 128k output.mp3

# 转换为 OGG 格式(更小)
ffmpeg -i input.mp3 -c:a libvorbis -q:a 4 output.ogg

发送大文件的替代方案

方案 1使用 TCP 客户端

TCP 命令行客户端支持更大的文件:

# 启动 TCP 客户端
run_client.bat  # Windows
./run_client.sh # Linux/Mac

# 发送文件
/file @用户名 大文件.mp4

方案 2分段发送

将大文件分割成多个小文件:

# Linux/Mac
split -b 1M large_file.zip part_

# Windows (PowerShell)
$file = [System.IO.File]::ReadAllBytes("large_file.zip")
$chunkSize = 1MB
for ($i = 0; $i -lt $file.Length; $i += $chunkSize) {
    $chunk = $file[$i..([Math]::Min($i + $chunkSize - 1, $file.Length - 1))]
    [System.IO.File]::WriteAllBytes("part_$($i/$chunkSize).zip", $chunk)
}

方案 3使用云存储

对于非常大的文件,建议使用云存储服务:

  1. 上传文件到云存储(如百度网盘、阿里云盘)
  2. 获取分享链接
  3. 在聊天中发送链接

错误提示说明

"文件大小不能超过2MB"

原因: 选择的文件超过了 Web 客户端的大小限制

解决方法:

  1. 压缩文件后再发送
  2. 使用 TCP 客户端发送
  3. 使用云存储分享链接

"文件编码后过大,可能导致传输失败"

原因: 文件 base64 编码后超过 100KB

解决方法:

  1. 进一步压缩文件
  2. 选择更小的文件
  3. 使用 TCP 客户端

"连接异常断开,可能是发送的文件过大"

原因: 文件传输过程中连接断开

解决方法:

  1. 检查网络连接
  2. 减小文件大小
  3. 重新连接后再试

性能优化建议

图片优化

  1. 选择合适的格式

    • 照片JPG有损压缩文件小
    • 图标/图表PNG无损压缩支持透明
    • 动画GIF 或 WebP
  2. 调整分辨率

    • 聊天分享1920x1080 足够
    • 缩略图800x600 即可
  3. 降低质量

    • JPG 质量 80-85 通常足够
    • 肉眼难以察觉差异

视频优化

  1. 选择合适的编码

    • H.264:兼容性好
    • VP9/AV1压缩率高
  2. 调整参数

    • 分辨率720p 或 480p
    • 码率500-1000 kbps
    • 帧率24-30 fps
  3. 剪辑视频

    • 只发送关键片段
    • 控制时长在 30 秒内

音频优化

  1. 选择合适的格式

    • MP3兼容性好
    • OGG压缩率高
    • AAC质量好
  2. 调整参数

    • 码率128 kbps 足够
    • 采样率44.1 kHz
    • 声道:单声道(语音)或立体声(音乐)

技术细节

Base64 编码开销

原始文件大小 → Base64 编码后大小
100 KB → 133 KB (+33%)
500 KB → 666 KB (+33%)
1 MB → 1.33 MB (+33%)
2 MB → 2.66 MB (+33%)

WebSocket 帧大小

  • 最大帧大小:理论上无限制
  • 实际限制:浏览器和服务器实现不同
  • 推荐大小:< 1MB 每帧
  • 我们的实现自动分片64KB 每片)

内存占用

发送 2MB 文件时的内存占用:

  1. 原始文件2MB
  2. Base64 编码2.66MB
  3. JSON 字符串:约 2.7MB
  4. WebSocket 缓冲:约 2.7MB
  5. 总计:约 10MB

接收端也需要类似的内存。

常见问题

Q: 为什么 Web 客户端限制这么小?

A: 因为浏览器环境的限制:

  • 内存限制
  • 单线程 JavaScript
  • 网络稳定性要求高
  • 用户体验优先

Q: 能否增加文件大小限制?

A: 可以修改代码中的限制,但不推荐:

// web/app.js
const maxSize = 5 * 1024 * 1024; // 改为 5MB

但这会增加传输失败的风险。

Q: TCP 客户端为什么支持更大文件?

A: 因为:

  • 直接使用 Socket没有浏览器限制
  • 可以使用更多内存
  • 传输更稳定
  • 可以显示进度

Q: 如何查看文件大小?

A:

  • Windows右键文件 → 属性
  • Mac右键文件 → 显示简介
  • Linuxls -lh 文件名

总结

  • Web 客户端:适合小文件(< 2MB方便快捷
  • TCP 客户端:适合大文件(< 100MB功能强大
  • 云存储:适合超大文件(> 100MB最可靠

选择合适的方式,享受流畅的聊天体验!