Java Tutorial/J2ME/Datagram
Содержание
Build a server for your mobile phone
<source lang="java">
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); } }
}</source>
Datagram Receiver
<source lang="java">
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); } }
}</source>
Use DatagramConnection
<source lang="java">
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); }
}</source>
Use Datagram in J2ME
<source lang="java">
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] + " "); } }
}</source>