@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(); } }