当前位置: 首页 > 知识库问答 >
问题:

传入缓冲区大小不能设置为Tyrus客户端

田昊天
2023-03-14
CountDownLatch messageLatch = new CountDownLatch(1);

final ClientEndpointConfig cec = ClientEndpointConfig.Builder.create().build();
ClientManager client = ClientManager.createClient();

client.getProperties().put(ClientProperties.INCOMING_BUFFER_SIZE, new Integer(17_000_000));
Integer tyrusIncomingBufferSize = Utils.getProperty(client.getProperties(), ClientProperties.INCOMING_BUFFER_SIZE, Integer.class);
System.out.println("tyrusIncomingBufferSize: " + tyrusIncomingBufferSize); // 17000000

client.connectToServer(new Endpoint() {
    @Override
    public void onOpen(Session session, EndpointConfig config) {
        try {
            session.addMessageHandler(new MessageHandler.Whole<ByteBuffer>() {

                @Override
                public void onMessage(ByteBuffer message) {
                    System.out.println("Received message: " + message);
                    messageLatch.countDown();
                }
            });

            File pic = new File(TEST_PIC); // the size is more than 4M
            FileInputStream fileReader = new FileInputStream(pic);
            final long sizeOfScreenshotFile = pic.length();
            System.out.println(sizeOfScreenshotFile); // 4734639
            byte[] screenshotData = new byte[(int) sizeOfScreenshotFile];
            fileReader.read(screenshotData);
            fileReader.close();

            ByteBuffer bb = ByteBuffer.wrap(screenshotData);
            session.getBasicRemote().sendBinary(bb);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}, cec, new URI(URI));
messageLatch.await(100, TimeUnit.SECONDS);
17000000
4734639
V 30, 2017 1:39:58 PM org.glassfish.tyrus.core.TyrusEndpointWrapper onError
WARNING: Unexpected error, closing connection.
java.lang.IllegalArgumentException: Buffer overflow.
    at org.glassfish.tyrus.core.Utils.appendBuffers(Utils.java:346)
    at org.glassfish.tyrus.core.TyrusWebSocketEngine$TyrusReadHandler.handle(TyrusWebSocketEngine.java:523)
    at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerFilter$ProcessTask.execute(GrizzlyServerFilter.java:379)
    at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:114)
    at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:91)
    at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerFilter.handleRead(GrizzlyServerFilter.java:215)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)

java.io.IOException: An established connection was aborted by the software in your host machine
    at sun.nio.ch.SocketDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
    at sun.nio.ch.IOUtil.write(IOUtil.java:51)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
    at org.glassfish.grizzly.nio.transport.TCPNIOUtils.flushByteBuffer(TCPNIOUtils.java:149)
    at org.glassfish.grizzly.nio.transport.TCPNIOUtils.writeSimpleBuffer(TCPNIOUtils.java:133)
    at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:126)
    at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:106)
    at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.processAsync(AbstractNIOAsyncQueueWriter.java:344)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:108)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.executeIoEvent(WorkerThreadIOStrategy.java:103)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.executeIoEvent(AbstractIOStrategy.java:89)
    at org.glassfish.grizzly.nio.SelectorRunner.iterateKeyEvents(SelectorRunner.java:415)
    at org.glassfish.grizzly.nio.SelectorRunner.iterateKeys(SelectorRunner.java:384)
    at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:348)
    at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:279)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)
-9.8634088E7
V 30, 2017 1:41:38 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow
INFO: Stopped listener bound to [0.0.0.0:8025]
V 30, 2017 1:41:38 PM org.glassfish.tyrus.server.Server stop
INFO: Websocket Server stopped.

我尝试调试Tyrus项目,看到incomingBufferSize变量实际上保持默认值。

有没有人知道我该怎么解决这个问题?

共有1个答案

洪飞驰
2023-03-14

您正在客户端中设置属性,但异常显然是在服务器上抛出的。

你如何启动服务器?您几乎像是在单独使用Grizzly--如果是这样的话,可以尝试将TyrusWebSocketEngine#incoming_buffer_size属性设置为17_000_000或任何您想要的值来启动服务器。

(这可以通过使用server(Map,Class...)或其他构造函数创建服务器来完成。

 类似资料:
  • 问题内容: 我正在使用以下bash命令模式运行memcached: 尝试跟踪整个平台上无与伦比的按键设置。 memtracer脚本在下面,并且可以按预期运行,但有一个小问题。观察中间日志文件的大小,直到memkeywatchYMD.log的大小约为15-18K时,memtracer.py才开始获取输入。有没有更好的方法可以读入stdin或将缓冲区大小减小到1k以下以获得更快的响应时间? 问题答案:

  • 问题内容: 我正在使用以下bash命令模式运行memcached: 尝试跟踪整个平台上关键的无与伦比的装备。 memtracer脚本在下面,并且可以按预期运行,但有一个小问题。注意中间日志文件的大小,直到memkeywatchYMD.log的大小约为15-18K时,memtracer.py才开始获取输入。有没有更好的方法可以读入stdin或将缓冲区大小减小到1k以下以获得更快的响应时间? 问题答案

  • 问题内容: 根据文档,使用默认缓冲区大小,而第二个构造函数允许设置缓冲区大小。 public BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。 但是,文档没有提到默认的缓冲区大小是多少。 BufferedReader的默认缓冲区大小是多少? 问题答案: 默认缓冲区大小为8192个字符 http://developer.android.com/ref

  • 根据文档,使用默认缓冲区大小,而第二个构造函数,允许设置缓冲区大小。 公共缓冲区读取器(读取器输入) 创建使用默认大小的输入缓冲区的缓冲字符输入流。 但是,文档没有提到默认缓冲区大小。 BufferedReader的默认缓冲区大小是多少?

  • 问题内容: 我正在使用低级I / O函数“写入”以我的代码(Linux上的C语言)将一些数据写入磁盘。首先,我将数据存储在内存缓冲区中,然后在缓冲区已满时使用“写入”将数据写入磁盘。那么“写”的最佳缓冲区大小是多少?根据我的测试,更快不是越大,所以我在这里寻找答案。 问题答案: 进行写操作可能是文件系统块大小的倍数,因此可能会有一些优势,尤其是在就地更新文件的情况下。如果向文件中写入的块少于部分块

  • 问题内容: 当我使用一些线程将数据写入单个文件时遇到问题。 我设置的缓冲区大小,但是无论设置多少,当缓冲区为8192(默认缓冲区大小)而不是我设置的大小(此处为16384)时,它都会将数据刷新到磁盘。我的代码有问题吗? 这就是我构建的方式: 这是完整的代码: 问题答案: 我通过使用OutputStream而不是writer解决了问题,这是代码: