package com.ronsoft.books.nio.channels; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.net.SocketAddress; import java.net.InetSocketAddress; /** * Test non-blocking DatagramChannel bug. * Sends one datagram to the "time" service on port 37 with a non-blocking * DatagramChannel. Then loops for a while receiving datagrams. The * first to arrive is the expected reply. Thereafter, the same address * will be returned forever (or until another real datagram arrives) * but no data will be transferred into the buffer. * The channel behaves the same way if placed in non-blocking before * the initial datagram is sent or after. * * @author Ron Hitchens (ron@ronsoft.com) * @version $Id: DGNonBlockBug.java,v 1.1 2002/04/28 20:52:17 ron Exp $ */ public class DGNonBlockBug { public static void main (String [] argv) throws Exception { String target = "time.nist.gov"; if (argv.length > 0) { target = argv [0]; } ByteBuffer buffer = ByteBuffer.allocate (4); buffer.flip(); // make it empty (RFC 868) DatagramChannel channel = DatagramChannel.open();; channel.configureBlocking (false); channel.send (buffer, new InetSocketAddress (target, 37)); System.out.println ("Sent one Datagram to " + target); // would potentially loop forever for (int i = 0; i < 10; i++) { buffer.clear(); buffer.putInt (0, 0); SocketAddress sa = channel.receive (buffer); if (sa == null) { System.out.println ("no datagram ready, " + "sleeping one second"); Thread.sleep (1000); } else { int value = buffer.getInt (0); buffer.flip(); System.out.println ("Received datagram from " + sa + ": " + buffer + ", value=" + Integer.toHexString (value)); } } } }