/** * Reads and returns a {@link DatagramPacket} from the underlying channel. * * @return the datagram packet read having the sender address. */ @Override public DatagramPacket read(SelectionKey key) throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); SocketAddress sender = ((DatagramChannel) key.channel()).receive(buffer); /* * It is required to create a DatagramPacket because we need to preserve which socket address * acts as destination for sending reply packets. */ buffer.flip(); DatagramPacket packet = new DatagramPacket(buffer); packet.setSender(sender); return packet; }