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