001    /*
002     * Copyright 2001-2005 The Apache Software Foundation
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.apache.commons.net;
017    
018    import java.io.IOException;
019    import java.util.Date;
020    import java.io.DataInputStream;
021    
022    /***
023     * The TimeTCPClient class is a TCP implementation of a client for the
024     * Time protocol described in RFC 868.  To use the class, merely
025     * establish a connection with
026     * {@link org.apache.commons.net.SocketClient#connect  connect }
027     * and call either {@link #getTime  getTime() } or
028     * {@link #getDate  getDate() } to retrieve the time, then
029     * call {@link org.apache.commons.net.SocketClient#disconnect  disconnect }
030     * to close the connection properly.
031     * <p>
032     * <p>
033     * @author Daniel F. Savarese
034     * @see TimeUDPClient
035     ***/
036    
037    public final class TimeTCPClient extends SocketClient
038    {
039        /*** The default time port.  It is set to 37 according to RFC 868. ***/
040        public static final int DEFAULT_PORT = 37;
041    
042        /***
043         * The number of seconds between 00:00 1 January 1900 and
044         * 00:00 1 January 1970.  This value can be useful for converting
045         * time values to other formats.
046         ***/
047        public static final long SECONDS_1900_TO_1970 = 2208988800L;
048    
049        /***
050         * The default TimeTCPClient constructor.  It merely sets the default
051         * port to <code> DEFAULT_PORT </code>.
052         ***/
053        public TimeTCPClient ()
054        {
055            setDefaultPort(DEFAULT_PORT);
056        }
057    
058        /***
059         * Retrieves the time from the server and returns it.  The time
060         * is the number of seconds since 00:00 (midnight) 1 January 1900 GMT,
061         * as specified by RFC 868.  This method reads the raw 32-bit big-endian
062         * unsigned integer from the server, converts it to a Java long, and
063         * returns the value.
064         * <p>
065         * The server will have closed the connection at this point, so you should
066         * call
067         * {@link org.apache.commons.net.SocketClient#disconnect  disconnect }
068         * after calling this method.  To retrieve another time, you must
069         * initiate another connection with
070         * {@link org.apache.commons.net.SocketClient#connect  connect }
071         * before calling <code> getTime() </code> again.
072         * <p>
073         * @return The time value retrieved from the server.
074         * @exception IOException  If an error occurs while fetching the time.
075         ***/
076        public long getTime() throws IOException
077        {
078            DataInputStream input;
079            input = new DataInputStream(_input_);
080            return (long)(input.readInt() & 0xffffffffL);
081        }
082    
083        /***
084         * Retrieves the time from the server and returns a Java Date
085         * containing the time converted to the local timezone.
086         * <p>
087         * The server will have closed the connection at this point, so you should
088         * call
089         * {@link org.apache.commons.net.SocketClient#disconnect  disconnect }
090         * after calling this method.  To retrieve another time, you must
091         * initiate another connection with
092         * {@link org.apache.commons.net.SocketClient#connect  connect }
093         * before calling <code> getDate() </code> again.
094         * <p>
095         * @return A Date value containing the time retrieved from the server
096         *     converted to the local timezone.
097         * @exception IOException  If an error occurs while fetching the time.
098         ***/
099        public Date getDate() throws IOException
100        {
101            return new Date((getTime() - SECONDS_1900_TO_1970)*1000L);
102        }
103    
104    }
105