public Message append(byte[] bytes, int offset, int length) { add(new Frame(bytes, offset, length)); return this; }
public String asString() { return new String(asBytes(), UTF_8); }
public byte[] asBytes() { byte[] data = new byte[getBytesLength()]; asBytes(data); return data; }
public Message(String message) { append(message); }
public void waitForMessage() throws IOException { if (!connectIfNot()) return; while (!message.isComplete()) { if (!onFrame(readFrame())) break; } if (!message.isComplete()) return; try { onMessage(message); } catch (Exception e) { onError(e); } message = new Message(); }
continue; message.add(frame); this.tempFrame = null; if (message.isComplete()) { webSocketHandler.onMessage(this, message); releaseByteBuffers(message); message.clear();
public void broadcast(byte[] bytes, int offset, int length) { broadcast(new Message(bytes, offset, length)); }
@Override public void run() throws IOException { for (Frame frame : message.getFrames()) { frame.mask().write(out); } out.flush(); } });
@Override public void onMessage(Message message) { messageHolder.set(message.asString()); } };
public Message(byte[] message, int offset, int length) { append(message, offset, length); }
out.flush(); message = new Message(); limit = 0; int response = 0;
public synchronized void sendMessage(Message message) { for (Frame frame : message.getFrames()) { connection.write(convertFrameToReadableData(frame), (ByteBufferProvider) Thread.currentThread()); } }
@Override public void onMessage(Message message) { messageHolder.set(message.asString()); } };
@Test public void testFrames() throws IOException, URISyntaxException, InterruptedException { handler = new WebSocketHandler() { @Override public void onMessage(WebSocketListener listener, Message message) { listener.sendMessage(message); } }; AtomicReference<String> messageHolder = new AtomicReference<>(); SimpleWebSocketClient client = new SimpleWebSocketClient("ws://localhost:" + getPort()) { @Override public void onMessage(Message message) { messageHolder.set(message.asString()); } }; Message message = new Message().append("foo").append(" ").append("bar"); client.send(message); client.waitForMessage(); Assert.assertEquals("foo bar", messageHolder.get()); }
public Message(byte[] message) { append(message); }
public void onMessage(T listener, Message message) { try { byte[] bytes = message.asBytes(); int[] holder = new int[1]; int position = readInt(holder, bytes, 0, bytes.length); int nameLength = holder[0]; String commandName; if (nameLength != -1) { commandName = new String(bytes, position, nameLength); } else { position = 0; nameLength = indexOf((byte) '{', bytes, position, bytes.length); commandName = new String(bytes, position, nameLength); } int offset = position + nameLength; Map.Entry<Class<? extends CommandPojo>, CommandHandler<? extends T, ? extends CommandPojo>> commandHandlerPair = handlers.get(commandName); if (commandHandlerPair == null) throw new IllegalArgumentException("Unknown command: " + commandName); CommandHandler<T, CommandPojo> handler = (CommandHandler<T, CommandPojo>) commandHandlerPair.getValue(); Class<? extends CommandPojo> commandClass = commandHandlerPair.getKey(); CommandPojo command = (CommandPojo) reader.read(commandClass, bytes, offset, bytes.length - offset); handler.handle(listener, command); } catch (Exception e) { onError(e); } }
protected void releaseByteBuffers(Message message) { for (Frame frame : message.getFrames()) { ((ByteArrayHolder) frame.getByteArraySupplier()).release(webSocketHandler.byteArrayHolderPool); } }
protected boolean onFrame(Frame frame) { if (frame.isPing()) return true; if (frame.isClose()) { connected = false; onClose(); return false; } message.add(frame); return true; }
@Override public void onMessage(WebSocketListener listener, Message message) { if ("close".equals(message.asString())) listener.close(); }