2017-05-30 4 views
3

Ich versuche, eine Datei größer als 4M über WebSocket zu übertragen. Ich verwende org.glassfish.tyrus:tyrus-server:1.13.1 und org.glassfish.tyrus:tyrus-container-grizzly-server:1.13.1 als Abhängigkeiten.Eingehende Puffergröße kann nicht auf Tyrus-Client eingestellt werden

Standardmäßig beträgt die Größe des eingehenden Puffers ca. 4M (siehe: 8.4. Incoming buffer size). Die Dokumentation sagt deutlich, was zu tun ist, wenn ich die Größe der Datei erhöhen möchte, aber die eingehende Puffergröße immer noch nicht ändern kann. Hier ist die Essenz dessen, was ich versuche zu tun:

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); 

Aber ich habe immer noch die gleichen Fehler:

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. 

Ich versuchte, das Tyrus Projekt zu debuggen und sah, dass die incomingBufferSize Variable tatsächlich blieb mit dem Standardwert.

Hat jemand eine Idee, wie kann ich das beheben?

Antwort

1

Sie legen die Eigenschaft im Client fest, aber die Ausnahme wird eindeutig auf dem Server ausgelöst.

Wie starten Sie den Server? Es scheint fast so, als ob Sie Grizzly Standalone verwenden - wenn Sie dies tun, können Sie versuchen, den Server mit der TyrusWebSocketEngine#INCOMING_BUFFER_SIZE-Eigenschaft auf 17_000_000 oder den von Ihnen gewünschten Wert zu starten.

(Das kann durch die Verwendung Server(Map, Class ...) oder anderen Konstrukteuren, indem Sie den Server erfolgen Siehe Server class javadoc für mehr Details

+0

Ich habe ein Problem dank Ihrer Antwort gelöst.Ich habe eine Karte mit der neuen eingehenden Puffergröße in den Server-Konstruktor injiziert und das löst mein Problem. Vielen Dank! – dim

0

Solution (dank @Pavel Bucek):..

Auf der Server-Seite:

Map<String,Object> properties = new HashMap<String, Object>(); 
properties.put("org.glassfish.tyrus.incomingBufferSize", 17000000); 
Server server = new org.glassfish.tyrus.server.Server("localhost", 8025, null, 
               properties, TestServer.class); 
Verwandte Themen