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
6.5 KiB
文件大小限制说明
为什么有文件大小限制?
WebSocket 协议虽然支持传输大文件,但在实际应用中会遇到以下问题:
- 浏览器内存限制 - 大文件的 base64 编码会占用大量内存
- 网络稳定性 - 大文件传输时间长,容易因网络波动而失败
- 用户体验 - 传输大文件会阻塞其他消息,影响聊天体验
- 服务器负载 - 多个用户同时传输大文件会导致服务器压力过大
文件大小限制
Web 客户端
| 文件类型 | 推荐大小 | 最大限制 | 说明 |
|---|---|---|---|
| 图片 | < 500KB | 2MB | 建议压缩后发送 |
| 视频 | < 1MB | 2MB | 建议发送短视频或压缩 |
| 音频 | < 1MB | 2MB | 建议使用压缩格式(MP3) |
| 语音消息 | < 500KB | 2MB | 录制时长建议 < 30秒 |
| 其他文件 | < 1MB | 2MB | 文档、压缩包等 |
重要提示:
- Base64 编码会使文件大小增加约 33%
- 实际传输大小 = 原文件大小 × 1.33
- 例如:1.5MB 的文件编码后约 2MB
TCP 客户端(命令行)
| 文件类型 | 推荐大小 | 最大限制 | 说明 |
|---|---|---|---|
| 任意文件 | < 50MB | 100MB | 受 JVM 内存限制 |
如何压缩文件
压缩图片
在线工具
- TinyPNG - 无损压缩 PNG/JPG
- Squoosh - Google 开发的图片压缩工具
- Compressor.io - 支持多种格式
命令行工具
# 使用 ImageMagick 压缩图片
magick convert input.jpg -quality 85 -resize 1920x1080 output.jpg
# 使用 pngquant 压缩 PNG
pngquant --quality=65-80 input.png --output output.png
压缩视频
在线工具
- CloudConvert - 在线视频转换和压缩
- Online-Convert - 支持多种格式
命令行工具
# 使用 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:使用云存储
对于非常大的文件,建议使用云存储服务:
- 上传文件到云存储(如百度网盘、阿里云盘)
- 获取分享链接
- 在聊天中发送链接
错误提示说明
"文件大小不能超过2MB"
原因: 选择的文件超过了 Web 客户端的大小限制
解决方法:
- 压缩文件后再发送
- 使用 TCP 客户端发送
- 使用云存储分享链接
"文件编码后过大,可能导致传输失败"
原因: 文件 base64 编码后超过 100KB
解决方法:
- 进一步压缩文件
- 选择更小的文件
- 使用 TCP 客户端
"连接异常断开,可能是发送的文件过大"
原因: 文件传输过程中连接断开
解决方法:
- 检查网络连接
- 减小文件大小
- 重新连接后再试
性能优化建议
图片优化
-
选择合适的格式
- 照片:JPG(有损压缩,文件小)
- 图标/图表:PNG(无损压缩,支持透明)
- 动画:GIF 或 WebP
-
调整分辨率
- 聊天分享:1920x1080 足够
- 缩略图:800x600 即可
-
降低质量
- JPG 质量 80-85 通常足够
- 肉眼难以察觉差异
视频优化
-
选择合适的编码
- H.264:兼容性好
- VP9/AV1:压缩率高
-
调整参数
- 分辨率:720p 或 480p
- 码率:500-1000 kbps
- 帧率:24-30 fps
-
剪辑视频
- 只发送关键片段
- 控制时长在 30 秒内
音频优化
-
选择合适的格式
- MP3:兼容性好
- OGG:压缩率高
- AAC:质量好
-
调整参数
- 码率: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 文件时的内存占用:
- 原始文件:2MB
- Base64 编码:2.66MB
- JSON 字符串:约 2.7MB
- WebSocket 缓冲:约 2.7MB
- 总计:约 10MB
接收端也需要类似的内存。
常见问题
Q: 为什么 Web 客户端限制这么小?
A: 因为浏览器环境的限制:
- 内存限制
- 单线程 JavaScript
- 网络稳定性要求高
- 用户体验优先
Q: 能否增加文件大小限制?
A: 可以修改代码中的限制,但不推荐:
// web/app.js
const maxSize = 5 * 1024 * 1024; // 改为 5MB
但这会增加传输失败的风险。
Q: TCP 客户端为什么支持更大文件?
A: 因为:
- 直接使用 Socket,没有浏览器限制
- 可以使用更多内存
- 传输更稳定
- 可以显示进度
Q: 如何查看文件大小?
A:
- Windows:右键文件 → 属性
- Mac:右键文件 → 显示简介
- Linux:
ls -lh 文件名
总结
- Web 客户端:适合小文件(< 2MB),方便快捷
- TCP 客户端:适合大文件(< 100MB),功能强大
- 云存储:适合超大文件(> 100MB),最可靠
选择合适的方式,享受流畅的聊天体验!