Websocket Send and Receive Image with Base64 带宽问题
Websocket Send and Receive Image with Base64 bandwith problem
我使用 Django 通道编写了一个网络套接字,现在想添加通过聊天发送图像的可能性(显然它是一个聊天应用程序)。
我现在做了什么:
- 用户选择一张图片(前端)
- 用户发送到后台(HTTPPOST)
- 我使用 Django 信号(它是数据库的侦听器)来检测是否有附加图像的新消息
- 我通过 websocket 发回图像
问题如下:
- 速度很慢(不太明显但很慢)
- 有时会导致奇怪的不当行为
所以现在我考虑将图像作为 base64 发送,然后直接将其发回,这样我就没有任何有用的 HTTP,因为它更快一点。
但是: Base64 图像大 20-30%,我需要在前端提取所有 exif 数据。是否有可能将图像作为文件通过 websocket 发送到后端,或者如果没有,是否有办法绕过更大的尺寸(20-30%),这是一个问题,因为我不能使用太多带宽: /
其他聊天应用程序如何解决这个问题?
WebSocket.send() 接受不同的 data-types 作为参数。您可以通过 WebSocket 双向传输二进制数据。
在 this snippet you can see how to make use of it on the client- and server-side in JavaScript. The Django channels also support binary data。
您可以将任何信息附加到文件中的二进制数据,并将其作为 header.
与文件一起发送
例如,用2(或3)个字节来表示header的长度。这意味着,最多 64KB(或最多 16MB)用于文件名和您可能需要的其他信息等信息。最后,这类似于 HTTP POST.
您发送的消息将如下所示:
len of header | header | file
-------------------+------------------------+-----------
00 00 up to FF FF | infos about the upload | binary
甚至多个文件也是可能的:
< header len >
< header >
< file len >
< file >
< header len file 2 >
< header file 2 >
< file 2 len >
< file 2 >
...and so on
之后您在服务器端要做的就是将合并的消息拆分回由长度值定义的部分。
我使用 Django 通道编写了一个网络套接字,现在想添加通过聊天发送图像的可能性(显然它是一个聊天应用程序)。
我现在做了什么:
- 用户选择一张图片(前端)
- 用户发送到后台(HTTPPOST)
- 我使用 Django 信号(它是数据库的侦听器)来检测是否有附加图像的新消息
- 我通过 websocket 发回图像
问题如下:
- 速度很慢(不太明显但很慢)
- 有时会导致奇怪的不当行为
所以现在我考虑将图像作为 base64 发送,然后直接将其发回,这样我就没有任何有用的 HTTP,因为它更快一点。
但是: Base64 图像大 20-30%,我需要在前端提取所有 exif 数据。是否有可能将图像作为文件通过 websocket 发送到后端,或者如果没有,是否有办法绕过更大的尺寸(20-30%),这是一个问题,因为我不能使用太多带宽: /
其他聊天应用程序如何解决这个问题?
WebSocket.send() 接受不同的 data-types 作为参数。您可以通过 WebSocket 双向传输二进制数据。
在 this snippet you can see how to make use of it on the client- and server-side in JavaScript. The Django channels also support binary data。
您可以将任何信息附加到文件中的二进制数据,并将其作为 header.
与文件一起发送例如,用2(或3)个字节来表示header的长度。这意味着,最多 64KB(或最多 16MB)用于文件名和您可能需要的其他信息等信息。最后,这类似于 HTTP POST.
您发送的消息将如下所示:
len of header | header | file
-------------------+------------------------+-----------
00 00 up to FF FF | infos about the upload | binary
甚至多个文件也是可能的:
< header len >
< header >
< file len >
< file >
< header len file 2 >
< header file 2 >
< file 2 len >
< file 2 >
...and so on
之后您在服务器端要做的就是将合并的消息拆分回由长度值定义的部分。