2017-05-30 1 views
3

Je tente de transférer un fichier supérieur à 4 Mo via WebSocket. J'utilise org.glassfish.tyrus:tyrus-server:1.13.1 et org.glassfish.tyrus:tyrus-container-grizzly-server:1.13.1 comme dépendances.La taille du tampon entrant ne peut pas être définie sur le client Tyrus

Par défaut, la taille du tampon entrant est d'environ 4M (voir: 8.4. Incoming buffer size). La documentation indique clairement ce qui doit être fait si je veux augmenter la taille du fichier mais ne peux toujours pas changer la taille du tampon entrant. Voici l'essence de ce que je suis en train de faire:

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

Mais j'ai encore la même erreur:

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. 

J'ai essayé de déboguer le projet Tyrus et vu que la variable incomingBufferSize effectivement resté avec la valeur par défaut.

Quelqu'un at-il une idée de comment puis-je résoudre ce problème?

Répondre

1

Vous définissez la propriété dans le client, mais l'exception est clairement affichée sur le serveur.

Comment démarrez-vous le serveur? Il semble presque que vous utilisiez Grizzly standalone - si vous le faites, vous pouvez essayer de démarrer le serveur avec la propriété TyrusWebSocketEngine#INCOMING_BUFFER_SIZE définie sur 17_000_000 ou la valeur que vous voulez.

(Cela peut se faire en créant le serveur en utilisant Server(Map, Class ...) ou d'autres constructeurs Voir Server class javadoc pour plus de détails

+0

J'ai résolu un problème grâce à votre réponse.J'ai injecté une carte avec la nouvelle taille de tampon entrant dans le constructeur du serveur et cela résout mon problème. – dim

0

Solution (grâce à @Pavel Bucek):..

Du côté du serveur:

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