के साथ टोमकैट में विफलता मैं 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();
}
}
मैं पहले से ही है <संदर्भ param> \t \t org.apache। tomcat.websocket.binaryBufferSize \t \t 163840 param-value> \t context-param> –
anandaravindan
I ईवेंट प्राप्त संदेश वापस भेजने का प्रयास करता है जिसने – anandaravindan
काम नहीं किया buffer.flip() के साथ प्रयास करें; संदेश भेजने से पहले –