24/05/2018, 23:05

Những protocol được hỗ trợ trong GCF

GCF hỗ trỡ nhiều loại protocol khác nhau. Khi có yêu cầu tạo một kết nối, class Connector sẽ sử dụng phương thức Class.forName() để tìm kiếm một class phù hợp với protocol đó. Nếu tìm thấy một đối tượng sẽ được trả về và thực thi interface Connection (hình ...

GCF hỗ trỡ nhiều loại protocol khác nhau. Khi có yêu cầu tạo một kết nối, class Connector sẽ sử dụng phương thức Class.forName() để tìm kiếm một class phù hợp với protocol đó. Nếu tìm thấy một đối tượng sẽ được trả về và thực thi interface Connection (hình vẽ). Dưới đây là cách để mở các kết nối khác nhau:

Connector.Open("socket://www.corej2me.com.com:55"); Connector.Open("http://www.corej2me.com"); Connector.Open("datagram://www.corej2me.com:1000"); Connector.Open("file://makefile.txt");

Mở mộ t kế t n ối

Để tạo kết nối, GCF đã cung cấp cho ta đến 7 phương thức:

Connector (public class Connector)

public static Connection open(String name)

public static Connection open(String name)

public static Connection open(String name, int mode, boolean timeouts)

public static DataInputStream openDataInputStream(String name)

public static DataOutputStream openDataOutputStream(String name)

public static InputStream openInputStream(String name)

public static OutputStream openOutputStream(String name)

Dưới đây là đoạn code mở kết nối thông qua stream

// Create a ContentConnection

String url = "http://www.corej2me.com"

ContentConnection connection = (ContentConnection) Connector.open(url);

// With the connection, open a stream

InputStream iStrm = connection.openInputStream();

// ContentConnection includes a length method int length = (int) connection.getLength();

if (length != -1)

{

byte imageData[] = new byte[length];

// Read the data into an array

iStrm.read(imageData);

}

Tuy nhiên, ngoài class ContentConnection, ta cũng có thể mở một kết nối trực tiếp bằng InputStream. Sau đây là đoạn code cho phép tải về một bức ảnh và sau đó tạo lại bức ảnh đó:

InputStream iStrm = (InputStream) Connector.openInputStream(url); Image img = null;

try

{

ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

int ch;

while ((ch = iStrm.read()) != -1)

bStrm.write(ch);

// Place into image array

byte imageData[] = bStrm.toByteArray();

// Create the image from the byte array

img = Image.createImage(imageData, 0, imageData.length);

}

finally

{

// Clean up

if (iStrm != null)

iStrm.close();

}

Lưu ý, trong đoạn code trên do không sử dụng class ContentConnection, nên ta sẽ không biết được kích thước của dữ liệu sẽ tải về. Để khắc phục vấn đề này, người ta sẽ dùng ByteArrayOutputStream để lưu dữ liệu tải về.

Dưới đây là ví dụ đơn giản, đầu tiên MIDlet sẽ download và hiển thị hình ảnh đã tải về. MIDlet sẽ dử dụng ByteArrayOutputStream để chứa dữ liệu tải về:

/*--------------------------------------------------

* DownloadImage.java

*

* Download and view a png file

*-------------------------------------------------*/ import javax.microedition.midlet.*; import javax.microedition.lcdui.*;

import javax.microedition.io.*;

import java.io.*;

public class DownloadImage extends MIDlet implements CommandListener

{

private Display display;

private TextBox tbMain;

private Form fmViewPng;

private Command cmExit;

private Command cmView;

private Command cmBack;

public DownloadImage()

{

display = Display.getDisplay(this);

// Create the textbox, allow maximum of 50 characters

tbMain = new TextBox("Enter url", "http://localhost/intel.png", 55, 0);

// Create commands and add to textbox

cmExit = new Command("Exit", Command.EXIT, 1);

cmView = new Command("View", Command.SCREEN, 2);

tbMain.addCommand(cmExit);

tbMain.addCommand(cmView );

// Set up a listener for textbox

tbMain.setCommandListener(this);

// Create the form that will hold the image

fmViewPng = new Form("");

// Create commands and add to form

cmBack = new Command("Back", Command.BACK, 1);

fmViewPng.addCommand(cmBack);

// Set up a listener for form

fmViewPng.setCommandListener(this);

}

public void startApp()

{

display.setCurrent(tbMain);

}

public void pauseApp()

{ }

public void destroyApp(boolean unconditional)

{ }

/*--------------------------------------------------

* Process events

*-------------------------------------------------*/

public void commandAction(Command c, Displayable s)

{

// If the Command button pressed was "Exit"

if (c == cmExit)

{

destroyApp(false);

notifyDestroyed();

}

else if (c == cmView)

{

// Download image and place on the form

try

{

Image im;

if ((im = getImage(tbMain.getString())) != null)

{

ImageItem ii = new ImageItem(null, im, ImageItem.LAYOUT_DEFAULT, null);

// If there is already an image, set (replace) it

if (fmViewPng.size() != 0)

fmViewPng.set(0, ii);

else // Append the image to the empty form

fmViewPng.append(ii);

}

else

fmViewPng.append("Unsuccessful download.");

// Display the form with image

display.setCurrent(fmViewPng);

}

catch (Exception e)

{

System.err.println("Msg: " + e.toString());

}

}

else if (c == cmBack) {

display.setCurrent(tbMain);

}

}

/*--------------------------------------------------

* Open connection and download png into a byte array.

*-------------------------------------------------*/

private Image getImage(String url) throws IOException

{

InputStream iStrm = (InputStream) Connector.openInputStream(url);

Image im = null;

try

{

ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

int ch;

while ((ch = iStrm.read()) != -1)

bStrm.write(ch);

// Place into image array

byte imageData[] = bStrm.toByteArray();

// Create the image from the byte array

im = Image.createImage(imageData, 0, imageData.length);

}

finally

{

// Clean up

if (iStrm != null)

iStrm.close();

}

return (im == null ? null : im);

}

}

Một textbox sẽ cho phép nhập địa chỉ URL

Sau khi tải về, hình ảnh sẽ được hiển thị

0