package primer56; import java.net.*; import java.io.*; public class UDPPoke { private int bufferSize; // in bytes private DatagramSocket socket; private DatagramPacket outgoing; public UDPPoke(InetAddress host, int port, int bufferSize, int timeout) throws SocketException{ outgoing = new DatagramPacket(new byte[1], 1, host, port); this.bufferSize = bufferSize; socket = new DatagramSocket(); socket.connect(host, port); socket.setSoTimeout(timeout); } public UDPPoke(InetAddress host, int port, int bufferSize) throws SocketException{ this(host, port, bufferSize, 30000); } public UDPPoke(InetAddress host, int port) throws SocketException{ this(host, port, 8192, 30000); } public byte[] poke() throws IOException{ byte[] response = null; try{ socket.send(outgoing); DatagramPacket incoming = new DatagramPacket(new byte[bufferSize], bufferSize); // next line blocks until the response is received socket.receive(incoming); int numBytes = incoming.getLength(); response = new byte[numBytes]; System.arraycopy(incoming.getData(), 0, response, 0, numBytes); }catch(IOException ex){ // response will be null } // may return null return response; } public static void main(String[] args) { InetAddress host; int port = 0; try{ host = InetAddress.getByName(args[0]); port = Integer.parseInt(args[1]); if(port < 1 || port > 65535) throw new Exception(); }catch(Exception ex){ System.out.println("Usage: java UDPPoke host port"); return; } try{ UDPPoke poker = new UDPPoke(host, port); byte[] response = poker.poke(); if(response == null){ System.out.println("No response within alloted time"); return; } String result = ""; try{ result = new String(response,"ASCII"); }catch(UnsupportedEncodingException e){ // try a different encoding result = new String(response, "8859_1"); } System.out.println(result); }catch(Exception ex){ System.err.println(ex); ex.printStackTrace(); } }// end main() }