【问题标题】:emit images to the client using socket.io使用 socket.io 向客户端发送图像
【发布时间】:2018-04-06 00:52:46
【问题描述】:

是否建议使用 socket.io 将图像 url 从服务器发送到客户端,然后在客户端,用户监听图像发出事件并显示在网页上?为什么我们需要在服务器端对图像进行 base64 编码,然后当您有更简单的方法将图像 url 发送到客户端时将其发送到客户端。 !

【问题讨论】:

  • 通过 socket.io 发送图像 URL 然后让浏览器使用普通 HTML 图像从您的 Web 服务器加载图像对我来说更有意义。
  • 对不起,我没听懂您的意思
  • 我想我在问题中说了同样的话

标签: node.js socket.io


【解决方案1】:

如果没有技术原因,您不能只通过 socket.io 发送 URL 并让您的客户端代码创建一个图像对象并将.src 设置为该 URL 以让浏览器以标准方式获取图像通过 URL,那肯定是首选。当然,您必须确保 Web 服务器已准备好在出现 URL 时提供该图像,并且如果该图像是该用户的唯一内容,那么该 URL 也必须是唯一的。

这让浏览器可以使用其最优化的代码来下载二进制图像,让浏览器缓存它们,让其他网络基础设施(如代理)进行优化等等......

为什么我们需要在服务器端对图像进行 base64 编码,然后将其发送到客户端,而您有更简单的方法将图像 url 发送到客户端?

你没有。

例如,您可以发送包含二进制数据的 HTTP 响应,在其中将 content-type 设置为某种二进制内容类型,然后将 content-length 设置为二进制数据的确切长度。下面是一个带有二进制数据的 JPEG 响应的最小示例:

HTTP/1.1 200 OK
Content-Length: 126750
Content-Type: image/jpeg

<binary image data here>

base64 是一种在传输不接受二进制数据时发送二进制数据的方案。听起来您已经知道,它的效率不如发送实际的二进制数据,因此当传输和接收方可以处理已知内容类型(例如图像)的二进制数据时,通常首选二进制。

【讨论】:

  • 感谢@jfriend00 的回复。我只是想了解当您对为什么我们在服务器端对图像进行 base64 编码然后将二进制数据发送到客户端的问题说“不”时
  • @roh_dev - 使用 socket.io 时您不必对它进行 base64 编码 - 这只是发送数据的一种选择。如果需要,您可以发送二进制数据。见How to send binary data with socket.io
  • 我知道如何发送二进制数据。 Base64 编码仅以字符串的形式为您提供二进制数据。但我的问题是当我谷歌如何将图像从服务器发送到客户端时,几乎每个答案都对应于 base64 编码图像然后发送到客户端。这种方法只是使向客户端发送图像的概念复杂化了我想当一个人有更简单的方法将图像 url 发送到客户端并且客户端在具有 src 属性的图像标签中使用它时
  • @roh_dev - http 响应必须指定数据的内容类型。有很多选择。 base64 编码是一种选择。您还可以发送原始图像类型,例如image/jpeg 或纯二进制,例如application/octet-stream,然后设置一个content-length,告诉收件人确切的数据量。请参阅我在答案中添加的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2011-06-06
相关资源
最近更新 更多