package ndgramnio; /************************************************************************* * Cette programme recoit un message (datagramme UDP) sur un DatagramSocket * associe au port argv[0]. * * ex: java DgramRecv 2005 * * Par receive, il attend un message (emis par send) et imprime son * contenu sur la sortie standard. * * receive recupere UN message sur le socket, celui qui est en tete * de la queue. Des receive ulterieurs permettraient de recuperer les * messages suivants eventuels. ************************************************************************/ import java.io.IOException; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import csc4509.SockUtil; public class MainNioRecvN { public static void main(String[] argv) { int received = 1; DatagramChannel rcvChan; DatagramSocket rcvSock; InetSocketAddress rcvAddress; InetSocketAddress senderAddress; ByteBuffer dataBuf; if (argv.length != 1) { System.out.println("usage: java MainRecv <port>"); return; } try { rcvChan = DatagramChannel.open(); rcvSock = rcvChan.socket(); rcvAddress = new InetSocketAddress(Integer.parseInt(argv[0])); rcvSock.bind(rcvAddress); dataBuf = ByteBuffer.allocate(SockUtil.bufSize); // receive data in while (true) { senderAddress = (InetSocketAddress) rcvChan.receive(dataBuf); SockUtil.printDebug(senderAddress); SockUtil.printMess(dataBuf); System.out.println("Message #" + received); received++; } } catch (SocketException se) { se.printStackTrace(); return; } catch (IOException se) { se.printStackTrace(); return; } } }