@Override @SuppressWarnings("unchecked") public void run() { byte[] buffer = new byte[1 << 16]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); try { while (true) { transport.receive(packet); RawPacket rawPacket = RawPacket.tryParse(Arrays.copyOfRange(packet.getData(), 0, packet.getLength())); if (rawPacket == null || rawPacket.getSourceIp().equals(socket.getIp()) || handledPackets.contains(rawPacket.hashCode())) { continue; } System.out.println("received " + rawPacket); Iterable<PacketListener> listenersCopy; synchronized (listeners) { listenersCopy = (Iterable<PacketListener>) listeners.clone(); } for (PacketListener listener : listenersCopy) { listener.onPacketReceived(rawPacket); } handledPackets.add(rawPacket.hashCode()); } } catch (IOException e) { e.printStackTrace(); } }
@Override protected void channelRead0(io.netty.channel.ChannelHandlerContext ctx, PacketsMessage message) throws Exception { ByteBuf content = message.getContent(); MainBaseClient client = message.getClient(); if (log.isTraceEnabled()) { log.trace( "In message: {} sessionId: {}", content.toString(CharsetUtil.UTF_8), client.getSessionId()); } while (content.isReadable()) { try { Packet packet = decoder.decodePackets(content, client.getSessionId()); Namespace ns = namespacesHub.get(packet.getEndpoint()); if (ns == null) { log.debug( "Can't find namespace for endpoint: {}, sessionId: {} probably it was removed.", packet.getEndpoint(), client.getSessionId()); return; } if (packet.getType() == PacketType.CONNECT) { client.addChildClient(ns); } NamespaceClient nClient = (NamespaceClient) client.getChildClient(ns); if (nClient == null) { log.debug( "Can't find namespace client in namespace: {}, sessionId: {} probably it was disconnected.", ns.getName(), client.getSessionId()); return; } packetListener.onPacket(packet, nClient); } catch (Exception ex) { String c = content.toString(CharsetUtil.UTF_8); log.error( "Error during data processing. Client sessionId: " + client.getSessionId() + ", data: " + c, ex); return; } } }
/** * Notify and process the packet listener if the filter matches the packet. * * @param packet the packet which was sent or received. */ public void notifyListener(Packet packet) { if (packetFilter == null || packetFilter.accept(packet)) { packetListener.processPacket(packet); } }
private void notifyPacketReceived(CrtpPacket inPacket) { checkForInitialPacketCallback(inPacket); for (PacketListener pl : this.mPacketListeners) { pl.packetReceived(inPacket); } }