Java Websockets 客户端 Undertow 的 BasicWebSocketSessionRemoteEndpoint sendBinary 抛出 BufferOverflowException
Java Websockets client Undertow's BasicWebSocketSessionRemoteEndpoint sendBinary throws BufferOverflowException
我有以下取自我的 websocket 客户端的代码片段:
byte[] message = "test".getBytes();
session.getBasicRemote().sendBinary(ByteBuffer.wrap(message));
会话是 UndertowSession 和 getBasicRemote() returns BasicWebSocketSessionRemoteEndpoint 对象。
当调用 sendBinary() 时,该方法会抛出 BufferOverflowException,堆栈跟踪如下:
java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:521)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:297)
at io.undertow.websockets.core.protocol.version07.WebSocket07FrameSinkChannel.createFrameHeader(WebSocket07FrameSinkChannel.java:129)
at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.getFrameHeader(AbstractFramedStreamSinkChannel.java:143)
at io.undertow.server.protocol.framed.AbstractFramedChannel.flushSenders(AbstractFramedChannel.java:623)
at io.undertow.server.protocol.framed.AbstractFramedChannel.flush(AbstractFramedChannel.java:715)
at io.undertow.server.protocol.framed.AbstractFramedChannel.queueFrame(AbstractFramedChannel.java:708)
at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.queueFinalFrame(AbstractFramedStreamSinkChannel.java:257)
at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.shutdownWrites(AbstractFramedStreamSinkChannel.java:242)
at io.undertow.websockets.core.WebSockets.sendBlockingInternal(WebSockets.java:468)
at io.undertow.websockets.core.WebSockets.sendBinaryBlocking(WebSockets.java:288)
at io.undertow.websockets.jsr.WebSocketSessionRemoteEndpoint$BasicWebSocketSessionRemoteEndpoint.sendBinary(WebSocketSessionRemoteEndpoint.java:267)
at myproject.core.server.utils.websocket.messagehandler.EchoStreamMessageHandler.onMessage(EchoStreamMessageHandler.java:49)
at myproject.core.server.utils.websocket.messagehandler.EchoStreamMessageHandler.onMessage(EchoStreamMessageHandler.java:12)
at io.undertow.websockets.jsr.FrameHandler.run(FrameHandler.java:248)
at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:553)
at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:542)
at io.undertow.websockets.jsr.FrameHandler.invokeBinaryHandler(FrameHandler.java:216)
at io.undertow.websockets.jsr.FrameHandler.onFullBinaryMessage(FrameHandler.java:329)
at io.undertow.websockets.core.AbstractReceiveListener.complete(AbstractReceiveListener.java:130)
at io.undertow.websockets.core.AbstractReceiveListener.complete(AbstractReceiveListener.java:124)
at io.undertow.websockets.core.BufferedBinaryMessage.handleEvent(BufferedBinaryMessage.java:113)
at io.undertow.websockets.core.BufferedBinaryMessage.handleEvent(BufferedBinaryMessage.java:98)
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at io.undertow.server.protocol.framed.AbstractFramedStreamSourceChannel.run(AbstractFramedStreamSourceChannel.java:273)
at io.undertow.server.protocol.framed.AbstractFramedChannel.run(AbstractFramedChannel.java:232)
at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:580)
at org.xnio.nio.WorkerThread.run(WorkerThread.java:464)
我还尝试使用分配的 ByteBuffer 调用 sendBinary:
ByteBuffer buff = ByteBuffer.allocate(message.length);
buff.put(message);
buff.flip();
this.session.getBasicRemote().sendBinary(buff);
但是遇到了同样的异常。
有什么解决办法吗?
谢谢!
埃尔达
好的,明白了:
我代码的其他部分将 Undertow 的网络套接字缓冲区大小更改为非常小的数字。
我有以下取自我的 websocket 客户端的代码片段:
byte[] message = "test".getBytes();
session.getBasicRemote().sendBinary(ByteBuffer.wrap(message));
会话是 UndertowSession 和 getBasicRemote() returns BasicWebSocketSessionRemoteEndpoint 对象。
当调用 sendBinary() 时,该方法会抛出 BufferOverflowException,堆栈跟踪如下:
java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:521)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:297)
at io.undertow.websockets.core.protocol.version07.WebSocket07FrameSinkChannel.createFrameHeader(WebSocket07FrameSinkChannel.java:129)
at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.getFrameHeader(AbstractFramedStreamSinkChannel.java:143)
at io.undertow.server.protocol.framed.AbstractFramedChannel.flushSenders(AbstractFramedChannel.java:623)
at io.undertow.server.protocol.framed.AbstractFramedChannel.flush(AbstractFramedChannel.java:715)
at io.undertow.server.protocol.framed.AbstractFramedChannel.queueFrame(AbstractFramedChannel.java:708)
at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.queueFinalFrame(AbstractFramedStreamSinkChannel.java:257)
at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.shutdownWrites(AbstractFramedStreamSinkChannel.java:242)
at io.undertow.websockets.core.WebSockets.sendBlockingInternal(WebSockets.java:468)
at io.undertow.websockets.core.WebSockets.sendBinaryBlocking(WebSockets.java:288)
at io.undertow.websockets.jsr.WebSocketSessionRemoteEndpoint$BasicWebSocketSessionRemoteEndpoint.sendBinary(WebSocketSessionRemoteEndpoint.java:267)
at myproject.core.server.utils.websocket.messagehandler.EchoStreamMessageHandler.onMessage(EchoStreamMessageHandler.java:49)
at myproject.core.server.utils.websocket.messagehandler.EchoStreamMessageHandler.onMessage(EchoStreamMessageHandler.java:12)
at io.undertow.websockets.jsr.FrameHandler.run(FrameHandler.java:248)
at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:553)
at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:542)
at io.undertow.websockets.jsr.FrameHandler.invokeBinaryHandler(FrameHandler.java:216)
at io.undertow.websockets.jsr.FrameHandler.onFullBinaryMessage(FrameHandler.java:329)
at io.undertow.websockets.core.AbstractReceiveListener.complete(AbstractReceiveListener.java:130)
at io.undertow.websockets.core.AbstractReceiveListener.complete(AbstractReceiveListener.java:124)
at io.undertow.websockets.core.BufferedBinaryMessage.handleEvent(BufferedBinaryMessage.java:113)
at io.undertow.websockets.core.BufferedBinaryMessage.handleEvent(BufferedBinaryMessage.java:98)
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at io.undertow.server.protocol.framed.AbstractFramedStreamSourceChannel.run(AbstractFramedStreamSourceChannel.java:273)
at io.undertow.server.protocol.framed.AbstractFramedChannel.run(AbstractFramedChannel.java:232)
at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:580)
at org.xnio.nio.WorkerThread.run(WorkerThread.java:464)
我还尝试使用分配的 ByteBuffer 调用 sendBinary:
ByteBuffer buff = ByteBuffer.allocate(message.length);
buff.put(message);
buff.flip();
this.session.getBasicRemote().sendBinary(buff);
但是遇到了同样的异常。
有什么解决办法吗?
谢谢!
埃尔达
好的,明白了:
我代码的其他部分将 Undertow 的网络套接字缓冲区大小更改为非常小的数字。