Java实现websocket发送长文本问题

这篇具有很好参考价值的文章主要介绍了Java实现websocket发送长文本问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java实现websocket时,每次发送的文本长度默认限制在8k范围内,原因是 org.apache.tomcat.websocket.WsSession进行了设置
 
 // Buffers
    static final int DEFAULT_BUFFER_SIZE = Integer.getInteger(
            "org.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE", 8 * 1024)
            .intValue();
    private volatile int maxBinaryMessageBufferSize = Constants.DEFAULT_BUFFER_SIZE;
    private volatile int maxTextMessageBufferSize = Constants.DEFAULT_BUFFER_SIZE;

如果发送超过8k的消息,就会报错:

No async message support and buffer too small Buffer size: [8,192], Message size: [10,240]
那么要实现类似发送文件的base64,网上有两种方式实现,第一种是实现ServletContextInitializer接口,对onStartup进行重载,大体代码如下:
 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.util.WebAppRootListener;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;


/**
* 设置websocket 传输内容的字节大小。 默认8k  当前设置50M
*/
@EnableWebSocket
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class WebSocketConfig  implements ServletContextInitializer {


    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }


    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.addListener(WebAppRootListener.class);
        servletContext.setInitParameter("org.apache.tomcat.websocket.textBufferSize","52428800");
        servletContext.setInitParameter("org.apache.tomcat.websocket.binaryBufferSize","52428800");
   }
}
这个方法会出现问题就是,每个websocket会话初始化就会占用设置的内存,如上代码是50M,这样连接达到一定数量就会内存溢出。
我们通常会使用另外一种方式,就是在注解 @OnMessage设置消息大小,代码如下:
 @OnMessage(maxMessageSize=5242880)
    public void onMessage(String message,  Session session, @PathParam("deviceNo")String  deviceNo) {
        log.info("message:"+message +"   ;deviceNo"+deviceNo);
        try {
            JSONObject obj =  JSONObject.parseObject(message);
            String funid  =  (String)obj.get("funid");
            JSONObject contentObj  =  (JSONObject)obj.get("content");
       }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第二种方式在500个连接情况下经过测试不会造成内存溢出文章来源地址https://www.toymoban.com/news/detail-516254.html

到了这里,关于Java实现websocket发送长文本问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包