Java Tutorial/J2ME/Datagram

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

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] + " ");
    }
  }
}