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

时间:2019-10-15 13:06:59

标签: java websocket spring-websocket

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

我正在尝试spring-websocket库,据我所知,我需要扩展BinaryWebSocketHandler类并在那里实现文件存储。

public class MyWebSocketHandler extends BinaryWebSocketHandler {

    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
          // Store file in DB/OS...
    }

}

虽然这看起来很棒,但我的问题是,我要处理的BinaryMessage只允许我使用ByteBuffer。我认为这意味着整个文件都已加载到内存中并存储在此ByteBuffer对象中(当然,除非我也重写supportsPartialMessages方法)。这是正确的吗?

如果是的话,这对我来说将是一个巨大的问题,因为我不希望在内存中存储大文件。我期望能够访问InputStream并从那里读取文件。似乎spring-websocket在后​​台使用Java WebSocket API,并且它们允许MessageHandler处理InputStream(请参阅https://docs.oracle.com/javaee/7/api/javax/websocket/MessageHandler.Whole.html),这似乎应该可行。

不幸的是,我找不到在处理程序中访问InputStream的任何方法。有人知道这是否真的可能吗?如果不是这样,将其作为功能请求有意义吗?还是某种程度上滥用WebSocket?

1 个答案:

答案 0 :(得分:0)

您可以覆盖AbstractWebSocketHandler.supportsPartialMessages,其中指出:

  

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

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/socket/WebSocketHandler.html