Java 与Servlet相比,使用Websocket下载文件的速度较慢
我使用Tomcat7.0.47WebSocket API编写了一个简单的文件下载程序。 下面是将文件作为二进制消息发送到客户端的方法Java 与Servlet相比,使用Websocket下载文件的速度较慢,java,tomcat,websocket,Java,Tomcat,Websocket,我使用Tomcat7.0.47WebSocket API编写了一个简单的文件下载程序。 下面是将文件作为二进制消息发送到客户端的方法 @OnMessage public void onMessage(Session session, String path) { ReadableByteChannel channel = null; int capacity = 1024 * 100; ByteBuffer buffer = Byt
@OnMessage
public void onMessage(Session session, String path) {
ReadableByteChannel channel = null;
int capacity = 1024 * 100;
ByteBuffer buffer = ByteBuffer.allocate(capacity);
try {
channel = Channels.newChannel(new FileInputStream(path));
while(channel.read(buffer) != -1){
buffer.flip();
session.getBasicRemote().sendBinary(buffer);
buffer.clear();
}
} catch (IOException e) {
logger.error("Error while reading the file to download", e);
} finally {
if (channel != null) {
try {
channel.close();
} catch (IOException e) {
logger.error("Error while closing the stream", e);
}
}
}
session.getAsyncRemote().sendText("done");
}
我已经使用SCP、基于Servlet的实现和Websocket实现对5GB文件的总下载时间进行了计时。使用WebSocket下载文件要慢得多。对于5GB文件,在我的测试机器上,SCP和servlet大约需要50秒,WebSocket大约需要180秒
有谁能帮助我理解我的实现有什么问题吗
WebSocket不适合这样的用例吗?是否需要调整tomcat配置参数以获得更好的性能?在tomcat中发送二进制数据有一个最大负载大小,即引用的org.apache.tomcat.websocket.binaryBufferSize。它的默认值是
8192
。因此,容量必须小于或等于此值
所以你的代码必须修改成这样
int capacity=session.getMaxBinaryMessageBufferSize()代码>
现在,将org.apache.tomcat.websocket.binaryBufferSize
的大小增加到合理的更高值,这可能会提高数据传输速度,从而提高下载速度
您可以使用web.xml
中的上下文初始化参数更改此值
例如:
org.apache.tomcat.websocket.binaryBufferSize
16384
您应该使用compact(),
而不是clear()。
谢谢,但这没有多大帮助。Clear应该比compact便宜,因为它只将位置设置为零。它是作为评论发布的,而不是回答。我知道clear()
做什么。我的观点是,调用它是错误的方法。在调用clear()
是正确的情况下,调用compact(),
也是正确的,并且不会更昂贵;在调用clear()
不正确的情况下,除了调用compact(),您别无选择。
<context-param>
<param-name>org.apache.tomcat.websocket.binaryBufferSize</param-name>
<param-value>16384</param-value>
</context-param>