springboot websocket不分包发消息设置
这阵子在跟一个硬件厂家对接设备,跟硬件的数据指令都是拿websocket传的,
他们家有一个让硬件播放音频的功能,简单来说就是通过websocket发送音频转base64后的字符串,然后硬件接收进行播放。
这时发生了一件很神奇的事情,短音频没问题,长音频就播不了了,经过层层排查,发现问题出在websocket服务上边。
先说解决方式,很简单,设置一下就可以。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @EnableDiscoveryClient @EnableFeignClients("com.pig.service") @SpringBootApplication public class PigServiceDevApplication { public static void main(String[] args) {
//设置websocket默认buffer字节大小 System.setProperty("org.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE", "30000"); SpringApplication.run(DTServiceHelmetApplication.class, args); } }
下边记录一下解决问题的过程。
首先判断问题,短音频可以,长音频不行,这俩不同就是一个数据大一个数据小,排除硬件等各种问题后,只有自己写的websocket服务跟厂家的不同,
在服务器装上wireshark,开始抓包。
先自己发一个消息看看什么样

再看眼厂家websocket正常的

发现啥不同没,厂家发送的websocket包只有1条,而我自己发送的包却被分割成2条发送了,
从websockt的payload length就能看出来,厂家的长度是17237,我自己的却是8192,8192,500,
估计对面的硬件对这种分包的websock信息没做处理,只能接收单包的,导致音频播放不了。
网上找什么设置 org.apache.tomcat.websocket.textBufferSize 大小的,设置完发现还是会分包,没办法在发送消息的代码上打断点进行跟踪。

跟到这个地方,发现了这个,8192,是不是很熟悉?
一看就是因为这几个buffer长度设置的问题,找到设置的语句,解决方法就好说了。


可以在main方法里设置,或者启动jar包的时候 -Dorg.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE=30000 也可以。
再推送一次消息,出现了一条FIN,length 12958,硬件也可喜可贺的播放了

这问题前期排查了好几天,硬件啊,服务器啊,最后排查到websocket然后找抓包软件抓包,终于解决了,开心!

浙公网安备 33010602011771号