gpt4 book ai didi

java - Spring websocket无法接收大数据

转载 作者:行者123 更新时间:2023-12-02 01:01:04 25 4
gpt4 key购买 nike

Websocket 配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/patrol").withSockJS();
}
}

端点:

@MessageMapping("/detection/face/frontal")
@SendTo("/topic/detection/face/frontal")
public String frontalFaceDetection(String encodedImage) throws IOException {
System.out.println("frontalFaceDetection was called");
byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(encodedImage);
return "TEST";
}

使用此配置,当我调用端点以 String 形式发送编码(base64)图像时,端点返回:

java.lang.Exception: java.net.SocketException: Broken pipe

<小时/>

我尝试更改 ServletServerContainerFactoryBean 的消息大小,在 WebSocketConfig 类中添加以下代码:

@Bean
public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(Integer.MAX_VALUE);
container.setMaxBinaryMessageBufferSize(Integer.MAX_VALUE);
return container;
}

但是现在错误是:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

<小时/>

我在 Android 客户端上对图像进行了编码,如下所示:

private String drawableToBase64(int resId) {
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), resId);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 100, bao);
byte[] ba = bao.toByteArray();
return Base64.encodeToString(ba, Base64.DEFAULT);
}

调试代码消息的大小是:2622244所以我尝试更改消息的大小(服务器端),如下所示:

@Bean
public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(2622244 + 1);
container.setMaxBinaryMessageBufferSize(2622244 + 1);
return container;
}

现在我明白

o.s.w.s.m.StompSubProtocolHandler        : Failed to parse TextMessage payload=[SEND
desti..], byteCount=2622291, last=true] in session ccfa1dfa-7076-395d-9c26-e0a8d106ba81. Sending STOMP ERROR to client.
org.springframework.messaging.simp.stomp.StompConversionException: The configured STOMP buffer size limit of 65536 bytes has been exceeded
<小时/>

我尝试了此SO thread中提出的解决方案同样,没有更多与内存相关的错误,但我再次得到:

java.lang.Exception: java.net.SocketException: Broken pipe

<小时/>

有人有解决这个问题的经验吗?我正在尝试不同的解决方案,但它不起作用。我哪里错了?有什么想法吗?
谢谢。

最佳答案

我发现的唯一方法是在配置中添加此代码:

@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
registry.setMessageSizeLimit(2048 * 2048);
registry.setSendBufferSizeLimit(2048 * 2048);
registry.setSendTimeLimit(2048 * 2048);
}

@Bean
public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(2048 * 2048);
container.setMaxSessionIdleTimeout(2048L * 2048L);
container.setAsyncSendTimeout(2048L * 2048L);
container.setMaxBinaryMessageBufferSize(2048 * 2048);
return container;
}

关于java - Spring websocket无法接收大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57768226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com