Wednesday, June 28, 2006

Network Programming dengan J2ME Wireless Devices

Network Programming dengan J2ME Wireless Devices

Veranita Saputra
202114707

Peralatan Wireless seperti telepon selular dapat menjaga pemiliknya terhubung dengan dunia luar setiap waktu di manapun mereka berada. Mereka menawarkan konektivitas yang bagus yang tidak disediakan oleh peralatan
lainnya. Pengembangan aplikasi untuk peralatan wireless ini telah menjadi permintaan yang besar pada beberapa tahun ke depan. Pemrograman jaringan memainkan peranan penting pada pengembangan aplikasi wireless untuk mengambil keuntungan dari konektivitas yang ditawarkan.

Sun’s Java 2 Micro Edition (J2ME) menawarkan platform untuk mengembangkan aplikasi yang tertanam dalam peralatan elektronik dan peralatan mobile. Pada Java 2 Micro Edition (J2ME), Connected Limited Devide Configuration (CLDC) mendefinisikan konfigurasi umum untuk broad range pada handheld devces. Pada bagian atas CLDC, Mobile Information Device Profile (MIDP) didefinisikan secara khusus untuk peralatan wireless seperti telepon selular dan two-way pagers. Penghasil peralatan wireless perlu mengimplementasikan MIDP untuk mendukung aplikasi Java pada peralatan mereka. Contohnya, Motorola hendak mengeluarkan implementasi MIDP untuk keluarga mobile phone iDEN pada kuarter pertama tahun 2001.

Pada bagian berikutnya, kita akan melihat apa yang baru pada pemrograman jaringan J2ME. Kemudian akan dibahas class HttpConnection pada J2ME MIDP dan akan ditutup dengan contoh bagaimana menggunakan class HttpConnection.

J2ME Generic Connection Framework
Pada Java 2 Standard Edition (J2SE), class yang terhubung dengan jaringan terletak pada package java.net. Kurang lebih terdapat 20 class pada package ini. Class-class ini menyediakan kumpulan fungi yang mendukung komunikasi jaringan pada aplikasi Java. Package java.net tidak sesuai untuk aplikasi wireless yang dijalankan pada telepon selular dan two-way pagers. Ukuran java.net kurang lebih 200KB. Ukuran ini terlalu besar untuk diletakkan pada peralatan wireless yang hanya mempunyai total memori dan tempat penyimpanan beberapa ratus kilobyte. Di samping ukuran, terdapat tantangan lainnya yang berkaitan dengan peralatan wireless: J2ME harus mendukung peralatan mobile yang bervariasi yang mempunyai ukuran dan bentuk yang berbeda-beda, kemampuan network yang berbeda-beda, dan kebutuhan file I/O yang berbeda.

Terdapat 1 class (Connector) dan 7 interface connection lainnya (Connection, ContentConnection, DatagramConnection, InputConnection, OutputConnection, StreamConnection, dan StreamConnectionNotifier) yang didefinisikan pada Generic Connection framework. Class-class tersebut dapat ditemukan pada package javax.microedition.io yang berasal dari J2ME CLDC. Sebagai catatan, tidak ada implementasi dari connection interface pada level CLDC. Implementasi sebenarnya pada sisi kiri MIDP. Ketujuh connection interface mendefinisikan gambaran 6 tipe dasar komunikasi : basic serial input, basic serial output, datagrams communications, sockets communications, mekanisme pada komunikasi client-server, dan komunikasi dasar HTTP dengan Web server.

Hubungan antara interface ini diilustrasikan pada diagram berikut ini :




Seperti yang terdapat pada gambar, connection adalah interface dasar dan root dari hirarki connection interface. Semua interface connection lainnya didapat dari Connection.StreamConnection. Di dalamnya terdapat InputConnection dan OutputConnection. Hal ini mendefinisikan kemampuan input dan output untuk koneksi stream. ContentConnection diperoleh dari StreamConnection. Class ini menambah mehod tambahan dari MIME pada bagian atas method I/O pada StreamConnection.
Class Connector adalah inti dari Generic Connection framework. Alasannya adalah karena semua objek connection yang telah disebutkan di atas dibuat oleh method static open yang didefinisikan pada class Connector. Tipe komunikasi yang berbeda dapat dibuat dengan method yang sama dengan parameter yang berbeda. Koneksi tersebut dapat berupa file I/O, serial port communication, datagram connection, atau http connection tergantung dari parameter string yang dipassingkan ke method tersebut. Desain tersebut membuat implementasi J2ME mudah diperluas dan fleksibel dalam mendukung peralatan dan produk baru.

Penggunaan method tersebut adalah sebagai berikut :
Connector.open(String connect);

Parameter connect adalah variabel String. Paramenter ini mempunyai format seperti URL: {protocol}:[{target}][{params}] dan terdiri dari 3 bagian : protocol, target, dan params. Ketentuan protocol adalah jenis connection yang akan dibuat oleh method. Terdapat beberapa nilai yang mungkin untuk protocol : file, socket, com, datagram, dan http. File menunjukkan connection yang akan digunakan untuk file I/O, comm menunjukkan connection yang akan digunakan untuk komunikasi serial port, dan http menunjukkan connection yang dibuat untuk mengakses web servers.
Target dapat berupa host name, nomor port network, nama file, atau nomor komunikasi port. Params optional, menunjukkan informasi tambahan yang diperlukan untuk melengkapi connect string. Contoh berikut ini menggambarkan bagaimana menggunakan method open untuk membuat jenis komunikasi yang berbeda berdasarkan protocol yang berbeda.

HTTP communication :
Connection hc = Connector.open("http://www.wirelessdevnet.com");

Stream-based Socket communication:
Connection sc = Connector.open("socket://localhost:9000");

Datagram-based socket communication:
Connection dc = Connector.open("datagram://:9000");

Serial-port communication:
Connection cc = Connector.open("comm:0;baudrate=9000");

File I/O:
Connection fc = Connector.open("file://foo.dat");

Seperti yang telah disebutkan sebelumnya, dukungan untuk protokol ini bervariasi dari vendor satu ke vendor lainnya. Developers harus mengecek dokumentasi untuk masing-masing penghasil device MIDP untuk mengetahui apakah mereka mendukung protocol tertentu. Socket, datagrams, dan koneksi http dengan MotoSDK (kit pengembangan dari Motorola) telah diuji. Ketiga jenis koneksi tersebut didukung oleh MIDP Motorola. Sun’s MIDP mereferensikan implementasi yang hanya mendukung koneksi HTTP. Jika program membuat koneksi berdasarkan protocol yang tidak didukung oleh device manufacturer, ConnectionNotFoundException akan diberikan.

Class HttpConnection

Class HttpConnection didefinisikan pada MIDP J2ME untuk mengijinkan develoer manghandle koneksi http pada aplikasi wirelessnya. Class HttpConnection pasti tersedia pada semua peralatan MIDP. Secara teori, kita mungkin menggunakan socket atau datagram untuk komunikasi remote pada aplikasi J2ME jika manufacturer device MIDP mendukungnya. Tetapi hal ini membuat aplikasi menjadi portable karena kita tidak dapat selalu bergantung pada manufacturer device lainnya . Hal ini berarti program tersebut mungkin dapat dijalankan pada satu peralatan MIDP tetapi tidak dapat dijalankan pada device MIDP lainnya. Jadi kita pertama kali harus menggunakan class HttpConnection pada aplikasi karena HTTPConnection adalah mandatory untuk semua aplikasi MIDP.
Interface HttpConnection didapat dari interface ContentConnection pada CLDC. Interface ini menginherit semua method I/O stream dari StreamConnection, semua MIME menghandle method dari ContentConnection dan menambah beberapa method tambahan untuk menghandle kebutuhan spesifik protocol http.

I/O yang terhubung:
DataInputStream openDataInputStream()
InputStream openInputStream()
DataOutputStream openDataOutputStream()
OutputStream openOutputStream()

Input stream dapat digunakan untuk membaca isi Web Server ketika output stream dapat digunakan untuk mengirim permintaan kepada Web server. Stream ini dapat diperoleh dari HttpConnection setelah koneksi dibangun pada Web Server. Pada contoh berikut ini, koneksi http dibentuk dengan web server
www.wirelessdevnet.com pada port 80 (port default). Kemudian input stream diperoleh untuk membaca respons dari Web:
HttpConnection hc = (HttpConnection);
InputStream is = new hc.openInputStream();
int ch;
// Check the Content-Length first
long len = hc.getLength();
if(len!=-1)
{
for(int i = 0;i
if((ch = is.read())!= -1 )
System.out.print((char) ch));
} else
{ // if the content-length is not available
while ((ch = is.read()) != -1)
System.out.print((char) ch));
}
is.close();
hc.close();

MIME yang terhubung:
String getEncoding()
Long getLength()
String getType()

Sekali koneksi http dibentuk, ketiga method dapat digunakan untuk memperoleh nilai nilai dari ketiga field pada header HTTP: Content-Length, Content-Encoding, dan Content-Type.

Protocol Http yang terhubung:
long getDate()
long getExpiration()
String getFile()
String getHeaderField(int index)
String getHeaderField(String name)
long getHeaderFieldDate(String name, long def)
int getHeaderFieldInt(String name, int def)
String getHeaderFieldKey(int n)
String getHost()
long getLastModified()
int getPort()
String getProtocol()
String getQuery()
String getRef()
String getRequestMethod()
String getRequestProperty(String key)
int getResponseCode()
String getResponseMessage()
String getURL()
void setRequestMethod(String method)
void setRequestProperty(String key, String value)

Method berikut ini untuk memperoleh informasi header: getDate, getExpiration, getFile, getHeaderField, getHeaderField, getHeaderFieldDate, getHeaderFieldInt, getHeaderFieldKey and getLastModified

Method berikut ini untuk memperoleh komponen individual yang diparse dari string URL: GetHost, getPort, getProtocol, getQuery, getRef, getRequestMethod, getRequestProperty, getResponseCode, getResponseMessage, dan getURL.

Ketiga method ini untuk dipakai bersama HEAD, GET, dan POST: setRequestMethod, setRequestProperty, and getRequestMethod

Berikut ini adalah contoh lengkapnya:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;

public class Sample1 extends MIDlet
implements CommandListener {
/*
* the default value for the URL string is
* http://www.webyu.com/servlets/webyu/wirelessdevnetsample1
*/

private static String defaultURL =
"http://www.webyu.com/servlets/webyu/wirelessdevnetsample1";

// GUI component for user to enter String
private Display myDisplay = null;
private Form mainScreen;
private TextField requestField;

// GUI component for displaying header information
private Form resultScreen;
private StringItem resultField;

// the "SEND" button used on the mainScreen
Command sendCommand = new Command("SEND", Command.OK, 1);

// the "BACK" button used on the resultScreen
Command backCommand = new Command("BACK", Command.OK, 1);

public Sample1(){
// initializing the GUI components for entering Web URL
myDisplay = Display.getDisplay(this);
mainScreen = new Form("Type in a string:");
requestField =
new TextField(null, "GREAT ARTICLE", 100, TextField.ANY);
mainScreen.append(requestField);
mainScreen.addCommand(sendCommand);
mainScreen.setCommandListener(this);
}

public void startApp() {
myDisplay.setCurrent(mainScreen);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable s) {
if (c == sendCommand) {
// retrieving the String that user entered
String requeststring = requestField.getString();
// sending a POST request to Web server
String resultstring = sendPostRequest(requeststring);
// displaying the response back from Web server
resultScreen = new Form("Result String:");
resultField = new StringItem(null, resultstring);
resultScreen.append(resultField);
resultScreen.addCommand(backCommand);
resultScreen.setCommandListener(this);
myDisplay.setCurrent(resultScreen);
} else if (c == backCommand) {
// do it all over again
requestField.setString("SOMETHING GOOD");
myDisplay.setCurrent(mainScreen);
}
}

// send a POST request to Web server
public String sendPostRequest(String requeststring) {
HttpConnection hc = null;
DataInputStream dis = null;
DataOutputStream dos = null;
StringBuffer messagebuffer = new StringBuffer();
try
{
// Open up a http connection with the Web server
// for both send and receive operations
hc = (HttpConnection)
Connector.open(defaultURL, Connector.READ_WRITE);
// Set the request method to POST
hc.setRequestMethod(HttpConnection.POST);
// Send the string entered by user byte by byte
dos = hc.openDataOutputStream();
byte[] request_body = requeststring.getBytes();
for (int i = 0; i <>
{dos.writeByte(request_body[i]); }
dos.flush();
dos.close();
// Retrieve the response back from the servlet
dis = new DataInputStream(hc.openInputStream());
int ch;
// Check the Content-Length first
long len = hc.getLength();
if(len!=-1)
{
for(int i = 0;i
if((ch = dis.read())!= -1)
messagebuffer.append((char)ch);
} else
{
// if the content-length is not available
while ((ch = dis.read()) != -1)
messagebuffer.append((char) ch);
}
}
dis.close();
} catch (IOException ioe)
{ messagebuffer = new StringBuffer("ERROR!"); }
finally {
// Free up i/o streams and http connection
try {
if (hc != null) hc.close();
}
catch (IOException ignored) {}
try
{ if (dis != null) dis.close(); }
catch (IOException ignored) {}
try
{ if (dos != null) dos.close(); }
catch (IOException ignored) {} }
return messagebuffer.toString();} }
sumber:
www.wirelessdevnet.com/channels/ java/features/j2me_http.phtml




No comments: