View Javadoc

1   /*
2    * Copyright 2001-2005 The Apache Software Foundation
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.commons.net;
17  
18  import java.io.IOException;
19  import java.net.DatagramPacket;
20  import java.net.InetAddress;
21  import java.util.Date;
22  
23  /***
24   * The TimeUDPClient class is a UDP implementation of a client for the
25   * Time protocol described in RFC 868.  To use the class, merely
26   * open a local datagram socket with
27   * {@link org.apache.commons.net.DatagramSocketClient#open  open }
28   * and call {@link #getTime  getTime } or
29   * {@link #getTime  getDate } to retrieve the time. Then call
30   * {@link org.apache.commons.net.DatagramSocketClient#close  close }
31   * to close the connection properly.  Unlike
32   * {@link org.apache.commons.net.TimeTCPClient},
33   * successive calls to {@link #getTime  getTime } or
34   * {@link #getDate  getDate } are permitted
35   * without re-establishing a connection.  That is because UDP is a
36   * connectionless protocol and the Time protocol is stateless.
37   * <p>
38   * <p>
39   * @author Daniel F. Savarese
40   * @see TimeTCPClient
41   ***/
42  
43  public final class TimeUDPClient extends DatagramSocketClient
44  {
45      /*** The default time port.  It is set to 37 according to RFC 868. ***/
46      public static final int DEFAULT_PORT = 37;
47  
48      /***
49       * The number of seconds between 00:00 1 January 1900 and
50       * 00:00 1 January 1970.  This value can be useful for converting
51       * time values to other formats.
52       ***/
53      public static final long SECONDS_1900_TO_1970 = 2208988800L;
54  
55      private byte[] __dummyData = new byte[1];
56      private byte[] __timeData = new byte[4];
57  
58      /***
59       * Retrieves the time from the specified server and port and
60       * returns it. The time is the number of seconds since
61       * 00:00 (midnight) 1 January 1900 GMT, as specified by RFC 868.
62       * This method reads the raw 32-bit big-endian
63       * unsigned integer from the server, converts it to a Java long, and
64       * returns the value.
65       * <p>
66       * @param host The address of the server.
67       * @param port The port of the service.
68       * @return The time value retrieved from the server.
69       * @exception IOException If an error occurs while retrieving the time.
70       ***/
71      public long getTime(InetAddress host, int port) throws IOException
72      {
73          long time;
74          DatagramPacket sendPacket, receivePacket;
75  
76          sendPacket =
77              new DatagramPacket(__dummyData, __dummyData.length, host, port);
78          receivePacket = new DatagramPacket(__timeData, __timeData.length);
79  
80          _socket_.send(sendPacket);
81          _socket_.receive(receivePacket);
82  
83          time = 0L;
84          time |= (((__timeData[0] & 0xff) << 24) & 0xffffffffL);
85          time |= (((__timeData[1] & 0xff) << 16) & 0xffffffffL);
86          time |= (((__timeData[2] & 0xff) << 8) & 0xffffffffL);
87          time |= ((__timeData[3] & 0xff) & 0xffffffffL);
88  
89          return time;
90      }
91  
92      /*** Same as <code> getTime(host, DEFAULT_PORT); </code> ***/
93      public long getTime(InetAddress host) throws IOException
94      {
95          return getTime(host, DEFAULT_PORT);
96      }
97  
98  
99      /***
100      * Retrieves the time from the server and returns a Java Date
101      * containing the time converted to the local timezone.
102      * <p>
103      * @param host The address of the server.
104      * @param port The port of the service.
105      * @return A Date value containing the time retrieved from the server
106      *     converted to the local timezone.
107      * @exception IOException  If an error occurs while fetching the time.
108      ***/
109     public Date getDate(InetAddress host, int port) throws IOException
110     {
111         return new Date((getTime(host, port) - SECONDS_1900_TO_1970)*1000L);
112     }
113 
114 
115     /*** Same as <code> getTime(host, DEFAULT_PORT); </code> ***/
116     public Date getDate(InetAddress host) throws IOException
117     {
118         return new Date((getTime(host, DEFAULT_PORT) -
119                          SECONDS_1900_TO_1970)*1000L);
120     }
121 
122 }
123