我是websockets的新手,当我试图通过长度大于8192
的JSON
时,websocket立即断开连接。而长度为<= 8191
的JSON
效果良好。
是否有任何MAX SIZE/ LIMIT
的数据可以通过WebSocket
传递?如果是,那是什么尺寸的?
我通过将这些行添加到我的web.xml
<context-param>
<param-name>org.apache.tomcat.websocket.textBufferSize</param-name>
<param-value>32768</param-value>
</context-param>
<context-param>
<param-name>org.apache.tomcat.websocket.binaryBufferSize</param-name>
<param-value>32768</param-value>
</context-param>
感谢@Davide Lorenzo MARINO
IT实际上是一个非常大的值,你可能不担心。
根据RFC-6455基本分帧,单个帧的最大大小限制为18,446,744,073,709,551,615字节(64位无符号值的最大值)。
尽量少处理你的需求。
因为问题是在服务器端(tomcat)产生的。检查tomcat文档,我看到:
所以你可以通过更新org.apache.tomcat.websocket来改变它。tomcat配置文件中的binaryBufferSize参数。二进制消息的默认缓冲区大小为8192字节。这可能是通过设置servlet上下文为web应用程序更改初始化参数org.apache.tomcat.websocket.binaryBufferSize到所需的字节值
更多信息请参阅tomcat指南
关于与WebSocket断开连接相关的问题,我在Android客户端中遇到了同样的问题,即接收下一条消息"二进制消息大小超过最大大小"。
在所有Jetty文档和其他网页中寻找一些解决方案后,我得到的唯一工作选项是在WebSocket类定义中包含下一个代码"maxBinaryMessageSize = size * 1024"(从客户端角度来看,大小是您所需的最大限制),如下所示:
import org.eclipse.jetty.websocket.api.BatchMode;
import org.eclipse.jetty.websocket.api.RemoteEndpoint;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
@WebSocket(maxBinaryMessageSize = 1024 * 1024)
public class MyClientWebSocket
{
@OnWebSocketClose
public void onClose(int statusCode, String reason)
{
closeLatch.countDown();
}
@OnWebSocketError
public void onError(Throwable reason)
{
//TODO ACORDARSE DE QUITAR ESTO
Log.w(TAG, "+++ ERROR : " + reason);
}
@OnWebSocketConnect
public void onConnect(Session session)
{
// your code
}
@OnWebSocketMessage
public void onMessageBinary(byte[] message, int offset, int length)
{
// message can be processed with a maximum of 1024 * 1024 bytes and not anymore limited to 64 * 1024
}
}
如果有WebSocket专家可以从客户端(Java/Android)确认这是否是一个正确的解决方案,这将是伟大的。谢谢。