2015-01-22 3 views
5

के साथ टोमकैट में विफलता मैं websocket के माध्यम से प्रोटोकॉल बफर का उपयोग करके एन्कोडेड बाइनरी संदेश भेजने की कोशिश कर रहा हूं। मैं ग्लासफ़िश 4.0 का उपयोग करके सफलतापूर्वक भेज सकता हूं। लेकिन नीचे एक अपवाद के साथ टोमकैट 8 में एक ही कोड विफल रहता है।टॉमकैट में वेबस्केट के माध्यम से बाइनरी संदेश भेजने में असमर्थ, लेकिन ग्लासफ़िश में काम करता है। 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) 

नीचे एक द्विआधारी संदेश से निपटने के लिए मेरी जावा कार्यान्वयन है और वापस भेज

@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(); 
     } 
    } 

उत्तर

4

ऐसा लगता है कि बिल्ला सर्वर विन्यास के बफर आकार की जांच की जरूरत है। द्विआधारी संदेशों के लिए डिफ़ॉल्ट बफर आकार 8192 बाइट है। WebSocket Howto

incomingAddressBook.toByteArray().length का मूल्य क्या है?

अपने web.xml में नीचे की कोशिश करो।,

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

इसके अलावा, नीचे का उपयोग करें।,

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

मैं पहले से ही है <संदर्भ param> \t \t org.apache। tomcat.websocket.binaryBufferSize \t \t 163840 \t anandaravindan

+0

I ईवेंट प्राप्त संदेश वापस भेजने का प्रयास करता है जिसने – anandaravindan

+0

काम नहीं किया buffer.flip() के साथ प्रयास करें; संदेश भेजने से पहले –

संबंधित मुद्दे

 संबंधित मुद्दे