Java Tutorial/J2ME/Datagram
Содержание
Build a server for your mobile phone
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.DatagramConnection;
public class J2METimeServer {
public static void main(String[] args) {
try {
Calendar cal = Calendar.getInstance();
DatagramConnection receiver =
(DatagramConnection)Connector.open("datagram://");
byte[] buffer = new byte[256];
Datagram dgram = receiver.newDatagram(buffer, buffer.length);
for (;;) {
dgram.setLength(buffer.length);
receiver.receive(dgram);
cal.setTime(new Date());
String time = cal.toString();
byte[] dataBytes = time.getBytes();
System.arraycopy(dataBytes, 0, buffer, 0, dataBytes.length);
dgram.setLength(dataBytes.length);
receiver.send(dgram);
}
} catch (IOException ex) {
System.out.println("IOException: " + ex);
}
}
}
Datagram Receiver
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.DatagramConnection;
public class J2MEDatagramReceiver {
public static void main(String[] args) throws Exception {
DatagramConnection receiver = (DatagramConnection) Connector
.open("datagram://:8888");
byte[] buffer = new byte[256];
Datagram dgram = receiver.newDatagram(buffer, buffer.length);
for (;;) {
dgram.setLength(buffer.length);
receiver.receive(dgram);
int length = dgram.getLength();
System.out.println("Datagram received. Length is " + length);
for (int i = 0; i < length; i++) {
System.out.print(buffer[i] + " ");
}
receiver.send(dgram);
}
}
}
Use DatagramConnection
import java.io.InterruptedIOException;
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.DatagramConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.rumand;
import javax.microedition.lcdui.rumandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class TimeMIDlet extends MIDlet implements CommandListener, Runnable {
private Display display;
private Form addressForm = new Form("Network Time");
private Form connectForm = new Form("Sending");
private Form displayForm = new Form("Server Reply");
private Command backCommand = new Command("Back", Command.BACK, 0);
private Command exitCommand = new Command("Exit", Command.EXIT, 0);
private Command okCommand = new Command("OK", Command.OK, 0);
private StringItem messageLabel = new StringItem(null, null);
private TextField serverName = new TextField("Time Server name:", "tock.usno.navy.mil",256, TextField.ANY);
protected void startApp() throws MIDletStateChangeException {
if (display == null) {
initialize();
display.setCurrent(addressForm);
}
}
protected void pauseApp() {
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
}
public void commandAction(Command cmd, Displayable d) {
if (cmd == okCommand) {
Thread t = new Thread(this);
t.start();
} else if (cmd == backCommand) {
display.setCurrent(addressForm);
} else if (cmd == exitCommand) {
try {
destroyApp(true);
} catch (MIDletStateChangeException ex) {
}
notifyDestroyed();
}
}
public void run() {
DatagramConnection conn = null;
display.setCurrent(connectForm);
try {
String server = serverName.getString();
String name = "datagram://" + server + ":" + 13;
conn = (DatagramConnection)Connector.open(name,
Connector.READ_WRITE, false);
Datagram dg = conn.newDatagram(10);
dg.setData("Hello".getBytes(), 0, 5);
conn.send(dg);
Datagram rdg = conn.newDatagram(512);
conn.receive(rdg);
messageLabel.setText(new String(rdg.getData(), 0, rdg.getLength()));
display.setCurrent(displayForm);
} catch (Exception ex) {
display.callSerially(new Runnable() {
public void run() {
Alert alert = new Alert("Invalid Address",
"The supplied address is invalid\n" +
"Please correct it and try again.", null,
AlertType.ERROR);
alert.setTimeout(Alert.FOREVER);
display.setCurrent(alert, addressForm);
}
});
return;
} catch (Error err) {
System.out.println(err);
err.printStackTrace();
}
}
private void initialize() {
display = Display.getDisplay(this);
addressForm.append(serverName);
addressForm.addCommand(okCommand);
addressForm.addCommand(exitCommand);
addressForm.setCommandListener(this);
connectForm.append(messageLabel);
connectForm.addCommand(backCommand);
connectForm.setCommandListener(this);
displayForm.append(messageLabel);
displayForm.addCommand(backCommand);
displayForm.setCommandListener(this);
}
}
Use Datagram in J2ME
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.DatagramConnection;
public class J2MEDatagramSender {
public static void main(String[] args) throws Exception {
DatagramConnection sender = (DatagramConnection) Connector
.open("datagram://localhost:8080");
int length = 100;
byte[] buffer = new byte[length];
for (int i = 0; i < length; i++) {
buffer[i] = (byte) ("0" + (i % 10));
}
Datagram dgram = sender.newDatagram(buffer, buffer.length);
sender.send(dgram);
for (int i = 0; i < length; i++) {
buffer[i] = (byte) 0;
}
sender.receive(dgram);
length = dgram.getLength();
System.out.println("Received return packet, length is " + length);
for (int i = 0; i < length; i++) {
System.out.print(buffer[i] + " ");
}
}
}