import java.io.IOException;
import java.util.Date;
import javax.microedition.io.*;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.*;
public class TimeServer extends MIDlet {
protected void startApp() {
DatagramConnection connection;
try {
connection = (DatagramConnection) Connector.open("datagram://:37");
Datagram incoming = connection.newDatagram(128);
Datagram response = connection.newDatagram(4);
while (true) {
try {
connection.receive(incoming);
response.reset();
response.setAddress(incoming);
response.setData(getTime(), 0, 4);
connection.send(response);
incoming.reset();
}
catch (IOException ex) {
// As long as it's just an error on this one connection
// we can ignore it
}
}
}
catch (IOException ex) {
// If we can't open the channel, put up an Alert
Alert alert = new Alert("UDP Error");
alert.setTimeout(Alert.FOREVER);
alert.setString("Could not connect to port 37. Needs root privileges?");
Display.getDisplay(this).setCurrent(alert);
}
}
private byte[] getTime() {
byte[] result = new byte[4];
Date now = new Date();
// The time protocol uses an unsigned 4-byte int so we have
// to do all the arithmetic with longs and then extract the
// four low-order bytes
long secondsSince1970 = now.getTime()/1000;
long differenceBetweenEpochs = 2208988800L;
long secondsSince1900 = differenceBetweenEpochs + secondsSince1970;
result[0] = (byte) ((secondsSince1900 & 0xFF000000) >>> 24);
result[1] = (byte) ((secondsSince1900 & 0xFF0000) >>> 16);
result[2] = (byte) ((secondsSince1900 & 0xFF00) >>> 8);
result[3] = (byte) (secondsSince1900 & 0xFF);
return result;
}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
}
|