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