Java 将任何图像流式传输到HTML客户端?

Java 将任何图像流式传输到HTML客户端?,java,image,servlets,streaming,gif,Java,Image,Servlets,Streaming,Gif,用例是引用HTML文档中的图像URL(例如),浏览器或电子邮件客户端将查看该URL,并使图像反映服务器确定的当前状态。图像将由后端(例如servlet)以固定的间隔(例如每分钟)动态计算和创建。它有点像视频馈送,但帧速率很低(每分钟一帧)。;) 我想这里至少有两个关键假设必须满足: 生成映像的后端必须能够发送映像的初始版本,然后发送映像的后续版本,例如在计算发送睡眠循环中,而无需客户端关闭连接。后端将保持与客户端的HTTP连接处于打开状态,并一直发送新版本,直到客户端关闭连接,例如,因为它不再显

用例是引用HTML文档中的图像URL(例如),浏览器或电子邮件客户端将查看该URL,并使图像反映服务器确定的当前状态。图像将由后端(例如servlet)以固定的间隔(例如每分钟)动态计算和创建。它有点像视频馈送,但帧速率很低(每分钟一帧)。;)

我想这里至少有两个关键假设必须满足:

  • 生成映像的后端必须能够发送映像的初始版本,然后发送映像的后续版本,例如在计算发送睡眠循环中,而无需客户端关闭连接。后端将保持与客户端的HTTP连接处于打开状态,并一直发送新版本,直到客户端关闭连接,例如,因为它不再显示文档

  • 获取图像的客户端将检测到后端不断发送图像的新版本并重新绘制。我不确定服务器是否可以显式地将此信号发送给客户端,例如,设置一个keep-alive响应头或类似的内容——或者,如果服务器将保持连接打开,甚至可能不需要它

  • 这些假设合理吗?对于后端,我将使用servlet作为概念证明,而前端将是类似Firefox的浏览器和类似Thunderbird的电子邮件客户端

    我不太确定服务器将如何向客户端发出信号,表明以前的映像已过时,可以丢弃,并且应该接收并重新绘制新映像,但可能只是刷新和重新发送新数据的问题?任何关于这方面的建议都将不胜感激


    使用动画gif之类的东西是行不通的,因为我无法提前知道图像是什么。换句话说,我无法预先计算图像序列并发送一次。

    服务器是否必须将图像发送到浏览器,而不是浏览器轮询图像

    通常,客户端轮询服务器以获取更新,因为这会降低服务器上的负载。也许你可以这样设计

    我从来没有尝试过,但你应该能够创建一个套接字,服务器可以发送图像到它。但我不确定这有多容易


    轮询服务器将是最简单的选择,不过在做了一些挖掘之后,我偶然发现了混合替换内容类型,请参阅。请注意,根据维基百科的条目,对它的支持似乎不是100%——我没有Internet Explorer或Outlook,因此无法测试,但它确实适用于当前版本的Chrome、Firefox和Thunderbird

    步骤:

  • 将“内容类型:多部分/x-mixed-replace;boundary=”发送到客户端

  • 对于要发送的每个图像,请执行以下操作:

    a) 发送“内容类型:”例如“图像/png”

    b) 将图像作为原始字节发送

    c) 像“-”一样发送边界--注意双连字符

    d) 齐平

  • 等待任何间隔并重复。客户端或服务器将关闭连接


  • 是的,这对服务器来说是相当沉重的。如果您需要为一个网页获取多个URL的图像,那么最好是轮询而不是流。然而,在我的例子中,关键的好处是避免电子邮件中的陈旧图像,并且用例需要单个图像,这在服务器上要轻得多。您可以向URL中添加参数来控制此行为。

    那么您想在收件人收到电子邮件后,通过更改热链接图像的内容来编辑收件人的电子邮件吗?我从未听说过有人使用这种技术。我建议只给他们一个链接,他们就可以看到那里的统计数据,这些统计数据应该用HTML呈现。@Ermir,HTML文档本身(例如电子邮件、网页)本身并没有编辑/更改,但HTML中引用的图像可能会不断更改(就像动画GIF一样,只是它不是静态数据,而是动态的)。HTML文档和引用的图像将是两个不同的URL。但是,是的,用户将看到的内容将以某种方式“编辑”,即当图像更改时更改。我试图解决的问题是避免刷新文档(例如页面/电子邮件)以获取当前图像-Kaare如果你想在不刷新的情况下更改内容,你需要使用Javascript,因为HTML电子邮件中没有Javascript,所以你尝试做的不会起作用。@“Osama Javed”,我可以在浏览器部分解决它,因为我可以让它轮询服务器。然而,我不确定这是否适用于电子邮件客户端。我会看看是否有办法让电子邮件客户端使用重定向循环甚至JavaScript刷新页面,但我非常喜欢以服务器为中心的解决方案,因为它会将逻辑保留在服务器上,并且我会避免旧电子邮件中潜在的旧逻辑。@kaared在这种情况下,node.js是我所知道的唯一允许服务器到客户端通信的东西。但即使这样,在电子邮件客户端也可能不起作用。祝你的项目好运