Programarea dispozitivelor cu resurse limitate
3. Construirea unei aplicaţii MIDlet
4. Construirea unei aplicaţii MIDlet folosind
Wireless Toolkit
5. Ciclul de viaţă al aplicaţiilor MIDlet
7. Comunicarea folosind protocoale de comunicaţie în
reţea
Scopul acestei lucrări este insuşirea
tehnicilor de programare folosind Java 2 Micro Edition pentru dispozitive cu
resurse limitate. Se va urmări înţelegearea modului de construire a
unei aplicaţii j2ME pentru configuratia CLDC.
Tehnologia Java 2 Micro Edition reprezintă un subset al Java 2
Standard Edition, şi este destinată programării dispozitivelor
cu resurse limitate cum ar fi telefoane mobiel, PDA-uri. J2ME este format
dintr-o maşină virtuală construită special pentru a rula
pe dispozitive cu resurse limitate,
şi un set de librării (Java API) ce oferă facilităţile
necesare construirii de aplicaţii java.
OBSERVATIE: Programatorul de dispozitive nu trebuie să se ocupe de
instalarea unei maşini virtuale pe dispozitiviul mobil, de obicei acestea
venind cu o maşină virtuală preinstaltă.
În figura 1 sunt prezentate cele trei componente ale J2ME.
Figura 1. Structura J2ME.
O configuraţie este formată dintr-o maşină
virtuală java (special concepută pentru a putea rula pe anumite
dispozitive) şi un set de clase de bază optimizate pentru a rula pe
un set de dispozitive cu anumite caracteristici.
În prezent sunt definite două configuraţii:
-
Conected
Device Configuration – este destinată dispozitivelor cu resurse
importante, având nevoie de minim 512K ROM, 256K RAM şi
care suportă o implementare completă a JVM.
-
Connected,
Limited Device Configuration – este destinată dispozitivelor cu resurse
mai limitate : 128k – 512k ROM, capacităţi de alimentare cu energie
limitate, conectivitate continuă sau intermitentă la anumite tipuri
de reţele, interfaţă grafică cu capacităţi
limitate ( sau fără interfaţă grafică).
Sun a dezvoltat o maşină virtuală nouă pentru a rula
aplicaţii J2ME pe dispozitive cu microprocesoare pe 16 şi 32 de
biţi. Acestă maşină virtuală poartă numele KVM
şi este destinată în special pentru configuraţia CLDC având
nevoie de numai 40K memorie, putând de asemenea fi ajustată în
funcţie de restricţiile dispozitivului pe care urmează să
ruleze.
Un profil reprezintă o colecţie de clase (Java API) pe care
dezvoltatorul le poate folosi pentru a construi aplicaţii.
În prezent sunt definite două profile:
-
Foundation
Profile – acest profil necesită configuraţia CDC
-
MID
Profile – acest profil necesită configuraţia CLDC
Pachetele opţionale reprezintă librării de clase ne
standard care oferă acces la anumite resurse specifice ale dispozitivului,
şi pe care dezvoltatorul trebuie sa le instaleze separat.
Figura 2. Tehnologiile Java
În mod tradiţional un dispozitiv vine cu o configuraţie
şi un profil preinstalat.
Procesul de construire a unei aplicaţii J2ME cuprinde
următoarele etape: construire arhitectură aplicaţie, codare,
compilare, preverificare, împachetare, testare şi instalare.
Înainte de a începe dezvoltarea de aplicaţii J2ME (denumite şi
MIDlet-uri), va trebui instalată, pe calculatorul pe care urmează
să se dezvolte aplicaţia, unealta J2ME
Wireless Toolkit 2.2.
Observatie: Pe maşina de dezvoltarea va trebui să fie instalat
J2SE 1.4.2 sau mai mare.
Observaţie: Dacă se doreşte dezvoltarea de aplicaţii
J2ME direct din mediul Eclipse se poate instala plug-inul Eclipse ME. Plug-inul
se găseşte aici sau poate fi
downloadat de pe site-ul oficial http://eclipseme.org.
Aplicaţiile MIDlet sunt diferite de aplicaţiile standard java.
Aplicaţiile MIDlet trebuie să extindă clasa abstractă
MIDlet din pachetul javax.microedition.midlet (în mod similar cu crearea
applet-urilor, pentru crearea cărora trebuie extinsă clasa Applet sau
JApplet).
În listing-ul următor este prezentată structura minimală
a unei aplicaţii de tip MIDlet.
package lab.scd.j2me;
import java.util.Date;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class DateTimeApp extends MIDlet {
Alert timeAlert;
public DateTimeApp() {
timeAlert = new Alert("Alarm!");
timeAlert.setString(new Date().toString());
}
public void startApp() {
Display.getDisplay(this).setCurrent(timeAlert);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Editaţi codul anterior în cadrul unui fişier cu
numele DateTimeApp.java şi salvaţi fişierul într-un director a
cărui structură are forma ...\lab\scd\j2me (de exempli:
d:\temp\lab\scd\j2me\DateTimeApp.java).
Compilarea unei aplicaţii MIDlet se face în mod
similar cu o aplicaţie obisnuită folosindu-se acelaşi utilitar
javac.exe (pentru mediul windows), doar că va trebui specificat parametrul
–bootclasspath care va indica calea către librăriile J2ME ce vor fi
folosite pentru compilare (daca nu se specifică acest parametru
aplicaţia va fi compilată în mod J2SE)
d:\temp>javac-bootclasspath
..\lib\cldcapi11.jar;..\lib\midpapi20.jar com\j2me\part1\DateTimeApp.java
Preverificarea este o etapă ce trebuie realizată
înainte de instalarea unei aplicaţii MIDlet pe un dispozitiv mobil. În
cadrul acestei etape este verificată integritatea şi corectitudinea
aplicaţiei MIDlet şi respectăspecificaţiile maşinii
virtuale pe care va fi rulată. Această verificare este realizată
pentru toate tipurile de aplicaţii java, dar pentru că maşina
virtuală pentru dispozitive mobile ar resurse limitate sarcina
verificării revine programatorului, şi aceasta se realizează
înainte de instalarea pe dispozitiv.
Wireless Toolkit conţine în directorul \bin utilitarul
preverify.exe ce este utilizat pentru realizarea acestei etape. Comanda ce
trebuie executată pentru a verifica un MIDlet este:
d:\temp>preverify.exe
-classpath ..\lib\cldcapi11.jar; ..\lib\midpapi20.jar
com.j2me.part1.DateTimeApp
În urma executării comenzii se va genera o versiunea
„preverificată” a DateTimeApp.class într-un director numit output.
Împachetarea aplicaţiei şi pregătirea
acesteia pentru a fi instalată presupune parcurgerea următorilor
paşi:
Se construieşte fişierului Manifest.mf cu următorul
conţinut:
MIDlet-Name:
DateTimeApp
MIDlet-Version: 1.0.0
MIDlet-Vendor: Your Name
Acest fişier va trebui construit în directorul .../output.
Se construieşte arhiva jar ce conţine aplicaţia şi
fişierul manifest:
d:\temp\output>jar cvfm DateTimeApp.jar Manifest.mf .\com
Se construieşte un fişier DateTimeApp.jad cu următorul
conţinut:
MIDlet-1:
DateTimeApp, , com.j2me.part1.DateTimeApp
MIDlet-Name: DateTimeApp
MIDlet-Version: 1.0.0
MIDlet-Vendor: Your Name
MIDlet-Jar-URL: DateTimeApp.jar
MIDlet-Jar-Size:
MicroEdition-Profile: MIDP-2.0
MicroEdition-Configuration: CLDC-1.1
Se salvează fişierul DateTimeApp.jad în acelaşi director
cu arhiva jar (în directorul ...\output). După cum se observă
atributul MIDlet-Jar-Size nu este completat. Valoarea acestui câm trebuie
să fie identică cu dimensiunea fişierului cu extensia .jar.
Aceasta poate diferi de la o maşină la alta, astfel încât în momentul
parcurgerii acestor paşi va trebui să citiţi valoarea
exactă a dimensiunii fişirului jar şi sa completaţi acest
atribut cu valoare corespunzătoare (în octeţi).
De exemplu pe maşina pe care a fost compilată şi
verificată aplicaţia dimensiunea fişierului .jar este de 1487
octeţi.
În acest moment este finalizată etapa de împachetare a
aplicaţiei, aceasta fiind pregătită pentru a fi rulată.
Testarea aplicaţiei MIDlet se face înainte de
încărcarea acesteia pe dispozitivul mobil. Testarea se realizează pe
un emulator ce simulează funcţionalităţile dispozitivului
pe care urmează să fie încărcată aplicaţia. Acest
emulator face parte din Wireless Toolkit. Pentru lansarea în execuţie a
emulatorului şi testarea aplicaţie se execută comanda:
D:\temp\output>emulator.exe -Xdescriptor
DateTimeApp.jad
După testarea aplicaţiei pe emulator se poate trece la ultimul
pas.
Instalarea aplicaţiei MIDlet pe dispozitivul mobil
se poate face în două moduri, fie printr-o conexiune directă între
dispozitiv şi calculator utilizând unul dintre mecanismele de
comunicaţie disponibile (bluetooth, USB, COM, etc...) fie prin Internet
(aceasta presupune că dispozitivul mobil are acces la Internet).
Unealta Wireless Toolkit automatizează paşii prezentaţi
anterior pentru construirea unei aplicaţii MIDlet, oferind programatorului
o interfaţă grafică prin intermediul cărei poate să
construiască aplicaţii de tip MIDlet putând efectua toţi
paşii prezentaţi în capitolul anterior.
Lansarea în execuţie a interfeţei Wireless Toolkit se face
executând fişierul ktoolbar.exe din directorul bin (din directorul de
instalare al Wireless Toolkit). În urma lansării va fi afişată
fereastra:
În continuare v-om crea acelaşi proiect ca şi în capitolul
anterior pentru a vede modul în care unealta Wireless Toolkit ajută
dezvoltatorul în procesul de construire a unei aplicaţii.
Se selecează opţiunea New Project... şi în fereastra care
apare se introduce numele proiectului: DateTimeApp şi MIDlet Class Name:
lab.scd.j2me.DateTimeApp.
În următoarea fereastră se pot seta parametrii MIDlet-ului,
printre care şi platforma de destinaţie pentru care va fi construit
acesta.
Se apasă butonul OK şi proiectul va fi generat.
Având în vedere ca se va construi aceiaşi aplicaţie ca şi
în capitolul anterior, se va refolosi codul sursă DateTimeApp.java şi
va fi copiat acest fişier în directorul proiectului în
...\DateTimeApp\src\lab\scd\j2me\.
În acest moment aplicaţia MIDlet este finalizată. Prin
apăsarea butonului Run, din cadrul ferestrei principale a Wireless Toolkit
se vor executa automat paşii de compilare, preverificare şi rulare în
cadrul emulatorului.
Dacă aplicaţia a rulat corect pe emulator se poate realiza
ultimul pas de inpachetare şi construire a fişierului jad. Pentru
aceasta se selecteaza opţiunea Create Package.
În acest moment aplicaţia MIDlet este pregătită pentru a
fi încărcată pe dispozitivul mobil.
Ciclul de viaţă al MIDlet-urilor este gestionat de către
Aplication Management System (AMS) – acesta fiind o aplicaţie aflată
pe dispozitivul mobil care gestionează proceslee de download, instalare,
rulare şi ştergere a MIDlet-urilor pe dispozitivul mobil.
În momentul în care utilizatorul selectează un MIDlet pentru a fi
executat, AMS îl lansează în execuţie şi îl pune în starea
Paused. În continuare AMS mută MIDlet-ul din starea Paused în starea
Active şi îl notifică prin apelarea metodei startApp(). În mod
similar sunt invocate metodele pauseApp() şi destroyApp() în momentul în
care aplicaţia este dusă în starea de pauză sau distrusă.
Folosind diagramele
de Masini cu Stări Finite reprezentarea stărilor unui MIDlet şi
tranziţiile posibile sunt reprezentate în figura următoare:
Stările unui MIDlet reprezentate utilizând FSM.
O atenţie deosebită trebuie acordată tranziţiei
stărilor pentru un MIDlet. De exemplu în condiţiile rulării
aplicaţiei pe un telefon mobil, în momentul recepţionării unui
apel, aplicaţia MIDlet este automat trecută în starea Paused.
Aplicaţia va trebui să îşi salveze starea şi să
îşi poată continua execuţia din punctul în care a rămas în
momentul în care va reveni în starea Active.
Acest capitol prezintă modul în care pot fi construite
interfeţe grafice în cadrul aplicaţiilor de tip midlet pentru
dispozitive mobile folosind MIDP 2.0.
Clasele pentru construirea interfeţelor grafice sunt localizate în
MIDP 2.0 în cadrul pachetelor: javax.microedition.lcdui şi
javax.microedition.lcdui.game. Clasele esenţiale sunt listate în figura x
şi figura y:
Figura x.
Figura y.
Utilizarea clasei Alert
Obiectele de tip Alert se recomandă a fi folosite pentru pentru
afişarea de informaţii sau mesaje de eroare ce rămân pe ecran o
perioadă scurtă de timp.
Setarea titlului alertei se face în cadrul constructorului.
Mesajul afişat de alertă este setat folosind metoda
setString() sau prin intermediul constructorului.
Tipurile de alerte ce pot fi afişate sunt: ALARM
, CONFIRMATION
, ERROR
, INFO
, şi WARNING
.
Metoda setTimeout(int time) poate fi folosită pentru a seta timpul
cât alerta este vizibilă pe ecran. Dacă este setată ca valoare de
timp constanta definită Alert.FOREVER atunci fereastra de tip alertă
devine modală şi permanentă pe ecran.
Asocierea unei imagini la alerta se face folosind metoda setImage(Image
img).
import
javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import
javax.microedition.midlet.MIDlet;
import
javax.microedition.midlet.MIDletStateChangeException;
public class mymidlet
extends MIDlet {
public mymidlet() {
}
protected void destroyApp(boolean arg0) throws
MIDletStateChangeException {
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
Alert a = new Alert("message displayed by java
midlet");
a.setTimeout(Alert.FOREVER);
Display.getDisplay(this).setCurrent(a);
}
}
Utilizarea clasei List
Listele modelează componente grafice ce permit selectarea uneia sau
mai multor opţiuni dintr-o listă. Optiunile pot fi de tip „radio
button” sau de tip „check box”.
Programul următor exemplifică modul în cre pot fi construite
şi utilizate obiectele de tip List.
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class ListExample extends MIDlet {
List fruitList1;
List fruitList2;
public ListExample() {
fruitList1 = new List("Select the fruits you like",
Choice.MULTIPLE);
fruitList1.append("Orange ", null);
fruitList1.append("Apple", null);
fruitList1.insert(1, "Mango", null);
// inserts between Orange and Apple
String fruits[] = {"Guava", "Berry ", "Kiwifruit"};
fruitList2 =
new List(
"Select the fruits you like - List 2",
Choice.IMPLICIT,
fruits,
null);
}
public void startApp() {
Display display = Display.getDisplay(this);
display.setCurrent(fruitList1);
try{
Thread.currentThread().sleep(3000);
} catch(Exception e) {}
display.setCurrent(fruitList2);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Utilizarea clasei TextBox
Clasa TextBox reprezintă componente grafice prin intermediul
cărora poate fi preluat text de la utilizator. Prin intermediul metodelor
definite în cadrul clsei pot fi aplicate diferite constrângeri asupra
obiectelor de tip TextBox.
Programul
următor exemplifică utilizarea clasei TextBox.
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class TextBoxExample extends MIDlet {
private TextBox txtBox1;
private TextBox txtBox2;
public TextBoxExample() {
txtBox1 = new TextBox(
"Your Name?", "", 50, TextField.ANY);
txtBox2 = new TextBox(
"Your PIN?",
"",
4,
TextField.NUMERIC | TextField.PASSWORD);
}
public void startApp() {
Display display = Display.getDisplay(this);
display.setCurrent(txtBox1);
try{
Thread.currentThread()Sleep(5000);
} catch(Exception e) {}
txtBox1.setString("Bertice Boman");
try{
Thread.currentThread()Sleep(3000);
} catch(Exception e) {}
// inserts 'w' at the 10th index to make the
// name Bertice Bowman
txtBox1.insert("w", 10);
try{
Thread.currentThread()Sleep(3000);
} catch(Exception e) {}
display.setCurrent(txtBox2);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Utilizarea clasei Form
Clasa Form
oferă posibilitaea de grupare a mai multor elemente grafice de tip Item.
Adăugarea de obiecte Item se face folosind metoda add(index i, Item i).
Item-urile care pot
fi adăugate în cadrul unui Form sunt: StringItem, DateItem, TextField,
ChoiceGroup, Spacer, Gauge, ImageItem, CustomItem.
Programul
următor exemplifică folosirea Item-urilor de mai sus cu excepţia
Item-ului CustomItem.
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Spacer;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class FormExample extends MIDlet {
private Form form;
private Gauge gauge;
private Spacer spacer;
private ImageItem imageItem;
private TextField txtField;
private DateField dateField;
private StringItem stringItem;
private ChoiceGroup choiceGroup;
public FormExample() {
form = new Form("Your Details");
// a StringItem is not editable
stringItem = new StringItem("Your Id: ", "WXP-890");
form.append(stringItem);
// you can accept Date, Time or DateTime formats
dateField = new DateField("Your DOB: ", DateField.DATE);
form.append(dateField);
// similar to using a TextBox
txtField = new TextField(
"Your Name: ", "", 50, TextField.ANY);
form.append(txtField);
// similar to using a List
choiceGroup = new ChoiceGroup(
"Your meals: ",
Choice.EXCLUSIVE,
new String[] {"Veg", "Non-Veg"},
null);
form.append(choiceGroup);
// put some space between the items to segregate
spacer = new Spacer(20, 20);
form.append(spacer);
// a gauge is used to show progress
gauge = new Gauge("Step 1 of 3", false, 3, 1);
form.append(gauge);
// an image may not be found,
// therefore the Exception must be handled
// or ignored
try {
imageItem = new ImageItem(
"Developed By: ",
Image.createImage("/duke.gif"),
ImageItem.LAYOUT_DEFAULT,
"DuKe");
form.append(imageItem);
} catch(Exception e) {}
}
public void startApp() {
Display display = Display.getDisplay(this);
display.setCurrent(form);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Interacţiunea cu utilizatorul
Aplicaţiile de tip Midlet interacţionează cu utilizatorul
prin intermediul comenzilor. O comandă este echivalentă unui buton
sau a unei opţiuni de meniu dintr-o aplicaţie obişnuită.
Comenzile sunt încapsulate în cadrul obiectelor de tip Command. Comenzile pot
fi ataşate componentelor grafice din cadrul midlet folosind metoda
addCommand(Command c). Un element de interfaţă grafică poate
avea asociat mai multe comenzi.
În momentul construirii obiectelor de tip Command pot fi
specificaţi următorii parametri: nume scurt al comenzii, nume extins
al comenzii (opţional), tipul comenzii şi prioritatea. Prin asocierea
la o comandă a unui tip, dispozitivul ce rulează aplicaţia va
putea mapa la comenzi anumite taste funcţionale. De exemplu o comandă
cu tipul Command.OK va fi mapată la tasta OK. Restul tipurilor care pot fi
asociate unei comenzi sunt: BACK, EXIT, HELP, ITEM, SCREEN şi STOP. Prioritatea
unei comenzi specifică gradul de importanţă al comenzii
respective şi in funcţie de aceasta dispozitivul va decide modul de
afişare a comenzilor.
Tratarea evenimentelor generate ca urmare a acţionării unei
comenzi este realizată de către implementatori ai interfeţei
CommandListener ce conţine metoda commandAction(Command c, Displayable d).
Înregistrarea unui ascultător de evenimente se face folosind comanda
addComandListener(CommandListener l).
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Spacer;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Command;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.CommandListener;
public class FormExample
extends MIDlet
implements CommandListener {
private Form form;
private Gauge gauge;
private Spacer spacer;
private ImageItem imageItem;
private TextField txtField;
private DateField dateField;
private StringItem stringItem;
private ChoiceGroup choiceGroup;
public FormExample() {
form = new Form("Your Details");
// a StringItem is not editable
stringItem = new StringItem("Your Id: ", "WXP-890");
form.append(stringItem);
// you can accept Date, Time or DateTime formats
dateField =
new DateField("Your DOB: ", DateField.DATE);
form.append(dateField);
// similar to using a TextBox
txtField = new TextField(
"Your Name: ", "", 50, TextField.ANY);
form.append(txtField);
// similar to using a List
choiceGroup = new ChoiceGroup(
"Your meals: ",
Choice.EXCLUSIVE,
new String[] {"Veg", "Non-Veg"},
null);
form.append(choiceGroup);
// put some space between the items
spacer = new Spacer(20, 20);
form.append(spacer);
// a gauge is used to show progress
gauge = new Gauge("Step 1 of 3", false, 3, 1);
form.append(gauge);
// an image may not be found,
// therefore the Exception must be handled
// or ignored
try {
imageItem = new ImageItem(
"Developed By: ",
Image.createImage("/duke.gif"),
ImageItem.LAYOUT_DEFAULT,
"Duke");
form.append(imageItem);
} catch(Exception e) {}
// create some commands and add them
// to this form
form.addCommand(
new Command("EXIT", Command.EXIT, 2));
form.addCommand(
new Command("HELP", Command.HELP, 2));
form.addCommand(
new Command("OK", Command.OK, 1));
// set itself as the command listener
form.setCommandListener(this);
}
// handle commands
public void commandAction(
Command com, Displayable dis) {
String label = com.getLabel();
if("EXIT".equals(label))
notifyDestroyed();
else if("HELP".equals(label))
displayHelp();
else if("OK".equals(label))
processForm();
}
public void displayHelp() {
// show help
}
public void processForm() {
// process Form
}
public void startApp() {
Display display = Display.getDisplay(this);
display.setCurrent(form);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
În cadrul aceste secţiuni este exemplificat modul în care poate fi
folosit J2ME pentru a implementa aplicaţii Midlet ce rulează pe
telefoane mobile şi comunică cu servere de internet prin intermediul
protocolului de comunicaţie TCP\IP.
La fel ca şi în cazul aplicaţiilor standar, în cazul
aplicaţiilor mobile se foloseşte conceptul de socket ce
reprezintă un capăt de conexiune prin intermediul căruia datele
sunt transmise şi recepţionate de către servere aflate la
distanţă.
Paşii necesari pentru a realiza comunicarea prin socket-uri în
cadrul aplicaţiilor mobile J2ME sunt următorii:
-
Deschiderea
conexiunii prin apelarea metodei statice
Connector.connect(„socket://123.23.2.12:888”). Această metodă
returnează un obiect de tip OutputConnection (ce permite doar transmiterea
de date), StreamConnection (ce permite comunicaţie
bidirecţională) sau InputConnection (ce permite doar operaţii de
recepţionare de date).
-
Construirea
fluxurilor de intrare ieşire de tip InputStream şi OutputStream.
-
Transmiterea
şi recepţionarea datelor prin intermediul fluxurilor construite.
-
Închiderea
fluxurilor după terminarea comunicaţiei.
import
javax.microedition.io.*;
import
java.io.*;
import
javax.microedition.lcdui.Display;
import
javax.microedition.lcdui.Form;
import
javax.microedition.lcdui.StringItem;
import
javax.microedition.midlet.MIDlet;
import
javax.microedition.midlet.MIDletStateChangeException;
public class SocketTest extends MIDlet {
String
connectString = "socket://127.0.0.1:888";
StreamConnection
streamConnection = null;
DataInputStream
dis = null;
DataOutputStream
dos = null;
Display
deviceDisplay;
Form
iniScreen;
Form
responseScreen;
StringItem
responseFiled;
public SocketTest() {
deviceDisplay = Display.getDisplay(this);
responseScreen = new Form("Response from server:");
iniScreen = new Form("Networking App");
iniScreen.append(new StringItem(null,"Connecting to:"+connectString));
}
protected void destroyApp(boolean arg0) throws
MIDletStateChangeException {
}
protected void pauseApp() {
}
protected void startApp() throws
MIDletStateChangeException {
try{
deviceDisplay.setCurrent(iniScreen);
//connect to
server
streamConnection =
(StreamConnection) Connector.open(connectString);
//create IO
streams
dos = streamConnection.openDataOutputStream();
dis = streamConnection.openDataInputStream();
iniScreen.append(new
StringItem(null,"Connection to server ok."));
//send data
iniScreen.append(new
StringItem(null,"Send data..."));
dos.writeChars("Hello\n\r");
dos.flush();
iniScreen.append(new
StringItem(null,"Receive data..."));
//receive data
StringBuffer sb = new StringBuffer();
int inputChar;
while ( (inputChar = dis.read()) != -1)
{
sb.append((char) inputChar);
}
//display the
results on the screen
responseFiled = new
StringItem(null,
sb.toString());
responseScreen.append(responseFiled);
deviceDisplay.setCurrent(responseScreen);
}catch(Exception e){
System.err.println("App
error:" + e);
iniScreen.append(new StringItem(null,"Error connecting:"+e.getMessage()));
}finally{
try {
if(dis!=null )dis.close();
if(dos!=null) dos.close();
if(streamConnection!=null) streamConnection.close();
}
catch (Exception e) {
System.err.println("App
error while clossing conenctions:" + e);
iniScreen.append(new StringItem(null,"Error clossing connection:"+e.getMessage()));
}
}
}
}