Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将二进制消息作为输入流处理?_Java_Websocket_Spring Websocket - Fatal编程技术网

Java 如何将二进制消息作为输入流处理?

Java 如何将二进制消息作为输入流处理?,java,websocket,spring-websocket,Java,Websocket,Spring Websocket,我想通过WebSocket实现大文件的上传,并让服务器将文件存储在数据库或对象存储中 我正在试用springwebsocket库,据我所知,我需要扩展BinaryWebSocketHandler类并在那里实现文件存储 公共类MyWebSocketHandler扩展了BinaryWebSocketHandler{ @凌驾 受保护的无效handleBinaryMessage(WebSocketSession会话,BinaryMessage消息)引发异常{ //在DB/OS中存储文件。。。 } }

我想通过WebSocket实现大文件的上传,并让服务器将文件存储在数据库或对象存储中

我正在试用
springwebsocket
库,据我所知,我需要扩展
BinaryWebSocketHandler
类并在那里实现文件存储

公共类MyWebSocketHandler扩展了BinaryWebSocketHandler{
@凌驾
受保护的无效handleBinaryMessage(WebSocketSession会话,BinaryMessage消息)引发异常{
//在DB/OS中存储文件。。。
}
}
虽然这看起来很棒,但我的问题是我要处理的
BinaryMessage
只允许我使用
ByteBuffer
s。我假设这意味着整个文件都加载到内存中,并存储在这个
ByteBuffer
对象中(当然,除非我也重写
supportsPartialMessages
方法)。这是正确的吗

如果是的话,这对我来说将是一个巨大的问题,因为在内存中存储大型文件并不是我想做的事情。我希望能够访问
InputStream
并从那里读取文件。这似乎也是可能的,因为
springwebsocket
在幕后使用了javawebsocketapi,它们允许
MessageHandler
s处理
InputStream
s(请参阅)


不幸的是,我无法在我的处理程序中找到任何访问
InputStream
的方法。有人知道这是否真的可能吗?如果不是,这是一个功能请求,还是某种程度上是对WebSocket的误用?

您可以覆盖
AbstractWebSocketHandler.supportsPartialMessages
,其中说明:

如果此标志设置为true,并且基础WebSocket服务器支持部分消息,则可能会拆分大WebSocket消息或未知大小的消息,并可能通过多次调用WebSocketHandler.handleMessage(WebSocketSession,WebSocketMessage)来接收。标志WebSocketMessage.isLast()指示消息是否为部分消息以及是否为最后一部分


我知道部分消息,但如果我使用这些消息,将文件持久化到数据库或对象存储中会变得困难得多。当我收到chunk#1时,我可以很容易地将其插入数据库,但是当它出现时,我如何追加chunk#2呢?我不知道有任何数据库无关SQL语句允许我这样做。这就是为什么我希望使用
InputStream
而不是字节数组。您可能不想写入数据库,而是想写入临时文件,然后在
isLast
上将该文件插入数据库。另请参阅:有一个我没有看到解决的问题是放弃传输。我希望避免这种情况,因为我的应用程序运行在一个磁盘空间有限的容器中,因此如果同时触发大量上载,使用临时文件可能会导致崩溃。使用SpringWebMVC和HTTP,我可以访问
InputStream
,并将其直接传递到数据库。我希望web套接字也能实现同样的效果,但显然情况并非如此。我将尝试在他们的GitHub页面中打开一个功能请求。也许这是有原因的。谢谢你给我指出相关的问题。显然,其他人也对此感兴趣。也许仅仅依靠WebMVC/HTTP进行此类上传是值得的,例如,通过套接字的消息可以“请求”端口和上传文件的权限,然后单独处理。通过链接两者,您可以直接将websocket会话与文件关联起来,并坚持使用websocket进行其他操作。实际上,我想使用websocket进行文件上载,使用HTTP进行其他操作。在请求到达我的应用程序之前,它通过一个路由器应用程序(即CloudFoundry的GoRouter)。此路由器会终止15分钟内未收到响应的每个请求,如果上载文件较大和/或用户的internet连接速度较慢,则很容易发生这种情况。然而,路由器不会终止web套接字通信(至少据我所知)。