2015-01-22 8 views
5

Ich versuche, binäre Nachricht mit Protokollpuffer über Websocket verschlüsselt senden. Ich kann erfolgreich mit Glassfish 4.0 senden. Aber der gleiche Code schlägt in Tomcat 8 mit Ausnahme unten fehl.Kann keine binäre Nachricht über Websocket in Tomcat senden, funktioniert aber in Glassfish. Fehler in Tomcat mit IllegalArgumentException

java.lang.IllegalArgumentException 
at java.nio.Buffer.limit(Buffer.java:267) 
at org.apache.tomcat.websocket.PerMessageDeflate.sendMessagePart(PerMessageDeflate.java:368) 
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:297) 
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:270) 
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendBytes(WsRemoteEndpointImplBase.java:132) 
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendBinary(WsRemoteEndpointBasic.java:43) 
at com.trsim.sim.endpoint.Whiteboard.broadcastSnapshot(Whiteboard.java:164) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80) 
at org.apache.tomcat.websocket.WsFrameBase.sendMessageBinary(WsFrameBase.java:586) 
at org.apache.tomcat.websocket.WsFrameBase.processDataBinary(WsFrameBase.java:543) 
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:295) 
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:130) 
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:60) 
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:203) 
at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:194) 
at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654) 
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:744) 

Unten ist mein Java-Implementierung für eine binäre Nachrichtenverarbeitung und schicken Sie es zurück

@OnMessage 
     public void broadcastSnapshot(ByteBuffer data, Session session) throws IOException { 
      //I am able to parse the incoming binary header data 
      Header incomingHeader = Header.parseFrom(data.array()); 
      Header header = Header.newBuilder().setCallback("2").setDecodeusing("MyClasstodecode").build(); 
      //I am able to parse the incoming data 
      AddressBook incomingAddressBook = AddressBook.parseFrom(data.array()); 


     //Creating Ouput messages 
     Person john = 
        Person.newBuilder() 
        .setId(1234) 
        .setName("John Doe") 
        .setEmail("[email protected]") 
        .addPhone(
         Person.PhoneNumber.newBuilder() 
         .setNumber("555-4321") 
         .setType(Person.PhoneType.HOME)) 
        .build(); 
     Person keith = 
       Person.newBuilder().setId(1234).setName("John Doe").setEmail("[email protected]").addPhone(Person.PhoneNumber.newBuilder().setNumber("555-4321").setType(Person.PhoneType.HOME)).build(); 
     AddressBook.Builder addressBook = AddressBook.newBuilder(); 
     addressBook.addPerson(john); 
     addressBook.addPerson(keith); 


     //Converting output message to byte array using Protocol buffers 
     byte[] headerArray = header.toByteArray(); 
     byte[] byteBuffer = addressBook.build().toByteArray(); 


     ByteBuffer outputBuffer = ByteBuffer.allocate(byteBuffer.length + headerArray.length); 
     outputBuffer.put(headerArray,0,headerArray.length); 
     outputBuffer.put(byteBuffer,0,byteBuffer.length); 

     try{ 
      //Send the received message first -- fails in tomcat but works in glassfish 4 
      ByteBuffer buffer = ByteBuffer.allocate(incomingAddressBook.toByteArray().length).put(incomingAddressBook.toByteArray()); 
      session.getBasicRemote().sendBinary(buffer); 

      //Send the response -- fails in tomcat.. But works in glassfish 4 
      session.getBasicRemote().sendBinary(outputBuffer); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

Antwort

4

Sieht aus wie Sie die Puffergröße von Tomcatbediener Konfiguration überprüfen müssen. Die Standardpuffergröße für binäre Nachrichten beträgt 8192 Byte. Siehe WebSocket Howto

Was ist der Wert incomingAddressBook.toByteArray().length?

die unten in Ihre web.xml Versuchen.,

<context-param> 
    <param-name>org.apache.tomcat.websocket.textBufferSize</param-name> 
    <param-value>32768</param-value> 
</context-param> 
<context-param> 
    <param-name>org.apache.tomcat.websocket.binaryBufferSize</param-name> 
    <param-value>32768</param-value> 
</context-param> 

Verwenden Sie auch die unten.,

ByteBuffer buffer = ByteBuffer.allocate(incomingAddressBook.toByteArray().length).put(incomingAddressBook.toByteArray()); 
buffer.flip(); //before sending message 
session.getBasicRemote().sendBinary(buffer); 
+0

Ich habe bereits \t \t org.apache. tomcat.websocket.binaryBufferSize \t \t 163840 \t anandaravindan

+0

I Ereignis versuchen, die empfangene Nachricht zurück, die nicht funktioniert – anandaravindan

+0

versuchen mit buffer.flip(); vor dem Senden der Nachricht –

Verwandte Themen