Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与Servlet相比,使用Websocket下载文件的速度较慢_Java_Tomcat_Websocket - Fatal编程技术网

Java 与Servlet相比,使用Websocket下载文件的速度较慢

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

我使用Tomcat7.0.47WebSocket API编写了一个简单的文件下载程序。 下面是将文件作为二进制消息发送到客户端的方法

    @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>