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ị