Answers

Question and Answer:

  Home  Java Network programming

⟩ Explain A Time Server?

Sending binary, nontext data is not significantly harder. Example demonstrates with a time server. This follows the time protocol outlined in RFC 868. When a client connects, the server sends a 4-byte, big-endian, unsigned integer specifying the number of seconds that have passed since 12:00 A.M., January 1, 1900 GMT (the epoch). The current time can be retrieved simply by creating a new Date object. However, since the Date class counts milliseconds since 12:00 A.M., January 1, 1970 GMT rather than seconds since 12:00 A.M., January 1, 1900 GMT, some conversion is necessary.

Example: A Time Server

import java.net.*;

import java.io.*;

import java.util.Date;

public class TimeServer {

public final static int DEFAULT_PORT = 37;

public static void main(String[] args) {

int port = DEFAULT_PORT;

if (args.length > 0) {

try {

port = Integer.parseInt(args[0]);

if (port < 0 || port >= 65536) {

System.out.println

("Port must between 0 and 65535");

return;

}

}

catch (NumberFormatException e) {}

}

// The time protocol sets the epoch at 1900,

// the java Date class at 1970. This number

// converts between them.

long differenceBetweenEpochs = 2208988800L;

try {

ServerSocket server = new ServerSocket(port);

while (true) {

Socket connection = null;

try {

OutputStream out = connection.getOutputStream( );

Date now = new Date( );

long msSince1970 = now.getTime( );

long secondsSince1970 = msSince1970/1000;

long secondsSince1900 = secondsSince1970

+ differenceBetweenEpochs;

byte[] time = new byte[4];

time[0]

= (byte) ((secondsSince1900 & 0x00000000FF000000L)

>> 24); time[1]

= (byte) ((secondsSince1900 & 0x0000000000FF0000L)

>> 16); time[2]

= (byte) ((secondsSince1900 & 0x000000000000FF00L)

>> 8); time[3]

= (byte) (secondsSince1900 & 0x00000000000000FFL);

out.write(time);

out.flush( );

} // end try

catch (IOException e) {

} // end catch

finally {

if (connection != null) connection.close( );

}

} // end while

} // end try

catch (IOException e) {

System.err.println(e);

} // end catch

} // end main

} // end TimeServer

As with the TimeClient of the previous chapter, most of the effort here goes into working with a data format (32-bit unsigned integers) that Java doesn't natively support.

public void close( ) throws IOException

 128 views

More Questions for you: