View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.net;
18  
19  import java.io.IOException;
20  import java.net.DatagramPacket;
21  import java.net.InetAddress;
22  
23  /***
24   * The CharGenUDPClient class is a UDP implementation of a client for the
25   * character generator protocol described in RFC 864.  It can also be
26   * used for Systat (RFC 866), Quote of the Day (RFC 865), and netstat
27   * (port 15).  All of these protocols involve sending a datagram to the
28   * appropriate port, and reading data contained in one or more reply
29   * datagrams.  The chargen and quote of the day protocols only send
30   * one reply datagram containing 512 bytes or less of data.  The other
31   * protocols may reply with more than one datagram, in which case you
32   * must wait for a timeout to determine that all reply datagrams have
33   * been sent.
34   * <p>
35   * To use the CharGenUDPClient class, just open a local UDP port
36   * with {@link org.apache.commons.net.DatagramSocketClient#open  open }
37   * and call {@link #send  send } to send the datagram that will
38   * initiate the data reply.  For chargen or quote of the day, just
39   * call {@link #receive  receive }, and you're done.  For netstat and
40   * systat, call receive in a while loop, and catch a SocketException and
41   * InterruptedIOException to detect a timeout (don't forget to set the
42   * timeout duration beforehand).  Don't forget to call
43   * {@link org.apache.commons.net.DatagramSocketClient#close  close() }
44   * to clean up properly.
45   * <p>
46   * <p>
47   * @author Daniel F. Savarese
48   * @see CharGenTCPClient
49   ***/
50  
51  public final class CharGenUDPClient extends DatagramSocketClient
52  {
53      /*** The systat port value of 11 according to RFC 866. ***/
54      public static final int SYSTAT_PORT = 11;
55      /*** The netstat port value of 19. ***/
56      public static final int NETSTAT_PORT = 15;
57      /*** The quote of the day port value of 17 according to RFC 865. ***/
58      public static final int QUOTE_OF_DAY_PORT = 17;
59      /*** The character generator port value of 19 according to RFC 864. ***/
60      public static final int CHARGEN_PORT = 19;
61      /*** The default chargen port.  It is set to 19 according to RFC 864. ***/
62      public static final int DEFAULT_PORT = 19;
63  
64      private byte[] __receiveData;
65      private DatagramPacket __receivePacket;
66      private DatagramPacket __sendPacket;
67  
68      /***
69       * The default CharGenUDPClient constructor.  It initializes some internal
70       * data structures for sending and receiving the necessary datagrams for
71       * the chargen and related protocols.
72       ***/
73      public CharGenUDPClient()
74      {
75          // CharGen return packets have a maximum length of 512
76          __receiveData = new byte[512];
77          __receivePacket = new DatagramPacket(__receiveData, 512);
78          __sendPacket = new DatagramPacket(new byte[0], 0);
79      }
80  
81  
82      /***
83       * Sends the data initiation datagram.  This data in the packet is ignored
84       * by the server, and merely serves to signal that the server should send
85       * its reply.
86       * <p>
87       * @param host The address of the server.
88       * @param port The port of the service.
89       * @exception IOException If an error occurs while sending the datagram.
90       ***/
91      public void send(InetAddress host, int port) throws IOException
92      {
93          __sendPacket.setAddress(host);
94          __sendPacket.setPort(port);
95          _socket_.send(__sendPacket);
96      }
97  
98      /*** Same as <code>send(host, CharGenUDPClient.DEFAULT_PORT);</code> ***/
99      public void send(InetAddress host) throws IOException
100     {
101         send(host, DEFAULT_PORT);
102     }
103 
104     /***
105      * Receive the reply data from the server.  This will always be 512 bytes
106      * or less.  Chargen and quote of the day only return one packet.  Netstat
107      * and systat require multiple calls to receive() with timeout detection.
108      * <p>
109      * @return The reply data from the server.
110      * @exception IOException If an error occurs while receiving the datagram.
111      ***/
112     public byte[] receive() throws IOException
113     {
114         int length;
115         byte[] result;
116 
117         _socket_.receive(__receivePacket);
118 
119         result = new byte[length = __receivePacket.getLength()];
120         System.arraycopy(__receiveData, 0, result, 0, length);
121 
122         return result;
123     }
124 
125 }
126