Слияние кода завершено, страница обновится автоматически
net.apexes.wsonrpc.server.WsonrpcServerBase#onMessage
public void onMessage(String sessionId, ByteBuffer buffer) {
try {
WebSocketSession session = WsonrpcRemotes.getSession(sessionId);
byte[] bytes = buffer.array(); // В некоторых случаях buffer типа DirectByteBuffer, не имеет метода array, вызов завершается неудачно
fireMessage(sessionId, bytes);
wsonrpcEngine.handle(session, bytes);
} catch (Exception ex) {
onError(sessionId, ex);
}
}
ByteBuffer обычно типа HeapByteBuffer и может быть успешно преобразован в byte[].
При интеграции Spring Websocket столкнулся с тем, что ByteBuffer является типом DirectByteBuffer и не может быть напрямую преобразован.
Конкретная причина неизвестна, я запускал несколько разных проектов, иногда это HeapByteBuffer, а иногда DirectByteBuffer. Возможно, связано с распределением памяти.
После изменения
public void onMessage(String sessionId, ByteBuffer buffer) {
try {
WebSocketSession session = WsonrpcRemotes.getSession(sessionId);
byte[] bytes = getBytes(buffer);
fireMessage(sessionId, bytes);
wsonrpcEngine.handle(session, bytes);
} catch (Exception ex) {
onError(sessionId, ex);
}
}
private byte[] getBytes(ByteBuffer buffer) {
if (buffer.hasArray()) {
// HeapByteBuffer
return buffer.array();
}
// DirectByteBuffer
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
return bytes;
}
Вход Перед тем как оставить комментарий