在播放框架中发送大文件时如何捕获客户端断开连接?

Posted

技术标签:

【中文标题】在播放框架中发送大文件时如何捕获客户端断开连接?【英文标题】:How to catch a client disconnection when sending a large file in play framework? 【发布时间】:2017-07-16 16:25:11 【问题描述】:

我正在发送一个正在播放的文件应用程序响应。当客户端下载文件时,我正在从本地服务器清理文件。我正在使用以下代码实现这一点:

val fileToServe = TemporaryFile(new File(fileName))
Ok.sendFile(fileToServe.file, onClose = () =>  fileToServe.clean )

但是当客户端断开连接时,临时文件仍保留在本地服务器中。但我想处理这种断开连接并清理 临时文件。我听说过 onDoneEnumerating() 但无法使用它。

谁能指出处理断开连接并从本地服务器清理临时文件的最简单方法?

【问题讨论】:

为什么不跟踪影响所有连接的每个临时资源?比如连接池? 请多多指教 这是我过去经常做的事情:每当收到连接时,我都会将连接存储在所有连接所在的全局对象中。使用字典,我将它们使用或分配的资源与每个连接相关联。在断开连接时,很容易抓取已使用的资源并对这些资源采取适当的操作。至于“如何检测”断开连接,我不知道你的框架。但这是基本的,所以我猜它已经实现了;-) 在游戏框架中,我找不到任何东西来捕捉断开连接。这是我的实际查询。 Play 中的 TemporaryFile 包含对文件系统上实际文件的引用,并在垃圾收集时将其清除。您可以尝试研究为什么实例没有被 GC 销毁。请记住,垃圾收集器不能保证立即运行。 【参考方案1】:

TemporaryFile 用于当 Play 接收到必须保存在临时文件位置的数据流时,而不是您将文件发送出去。它在最终确定(2.6 之前)或幻像文件引用(2.6.x)时删除。

捕获断开连接的最简单方法是调用 Files.deleteIfExists

https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#deleteIfExists-java.nio.file.Path-

在 onClose 块中。如果由于某种原因这似乎不起作用,您可以使用临时文件收割器:

https://www.playframework.com/documentation/2.6.x/ScalaFileUpload#Cleaning-up-temporary-files

这会经常清理临时文件目录。

【讨论】:

以上是关于在播放框架中发送大文件时如何捕获客户端断开连接?的主要内容,如果未能解决你的问题,请参考以下文章

发送大文件/图像时,多人会话断开连接

如何从客户端断开和重新连接 socket.io?

如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]

当互联网连接或断开时得到通知

如何配置 NSURLSession 请求在连接断开时的重试尝试?

websocket客户端可能会断开连接以一次接收多个包?