Java Tutorial/J2ME/Datagram

Материал из Java эксперт
Перейти к: навигация, поиск

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>