Creating Network-Enabled Applications

Post on 22-Jan-2016

51 views 0 download

description

CSCI 7010 UGA March 23 rd , 2010. Creating Network-Enabled Applications. Ways to Connect. BES/MDS TCP/IP BIS WiFi WAP 2.0 WAP 1.0. BES/MDS. Blackberry Enterprise Server/Mobile Data System used if the Blackberry device is owned by a company and is set up to run through their servers - PowerPoint PPT Presentation

Transcript of Creating Network-Enabled Applications

CSCI 7010UGAMarch 23rd, 2010

BES/MDSTCP/IPBISWiFiWAP 2.0WAP 1.0

Blackberry Enterprise Server/Mobile Data System used if the Blackberry device is owned

by a company and is set up to run through their servers

lets the Blackberry device make a secure connection to corporate servers

Transmission Control Protocol/Internet Protocol

a “regular” internet connectionworks with most devices

Blackberry Internet Service for devices that aren’t under a BES

used to send email Internet connections, but less secure

than BES but you need to be part of the

Blackberry Alliance Program to use it

802.11 B/G and sometimes A allows device to connect to network via

a WiFi router device user has to configure device to

connect to the router Pro: better speed, lower latency, no

carrier data charges Con: WiFi coverage less than wireless

network coverage can write app so that it looks for WiFi

first and then falls back to BES or BIS

Wireless Access Protocolconnects through wireless carrier’s

WAP gatewayno Blackberry-specific infrastructure

but user’s plan must support WAP 2.0 (most do)

don’t need to configure as with TCP/IP

older version of WAPsupported by all Blackberry devicesbut doesn’t support secure

connections as do other methods

What should you do? If activated on a BES:

use BES/MDS If not activated on a BES:

use WAP 2.0 fall back to TCP/IP

In either case, might want to check for WiFi

how the device maintains info about its configuration

records about optional applicationsemail account configurationconnection methods available on a

device

open device Options

click Advanced Options Service Book

Demo on the simulator

Two parts: CID – defines the type of record UID – a unique identifier

most connection methods have a record in the service book

javax.microedition.io.Connector used it before to open files can also use it to open network connections

Example: HttpConnection connection = (HttpConnection)

Connector.open(“http://www.cnn.com”); or HttpConnection connection = (HttpConnection)

Connector.open(“http://www.apress.com”);

Connection_type connectionName= (Connection_type) Connector.open(URL);

Connection_type is some subclass of ConnectionconnectionName is a variable name that you

chooseURL takes the form

scheme://host:port/path[optional parameters]Example URLs:

file://myfile.htmlhttp://www.apress.com:80/book/catalogsocket://www.apress.com:80https://www.amazon.com/gp/flex/sign-in/select.html

Hypertext transfer protocol protocol of the World Wide Web connectionless request-response

opens a connection to an http serversends a request message receives the responsedisplays result

listens for a connection from client receives a requestdelivers a responsecloses the connection

initial line (different for request & response)

header lines (zero or more)blank lineoptional message body

METHOD path http_version GET /path/to/file/index.html HTTP/1.0

METHOD: GET – “Please send this resource” POST – “Here are some details about it” HEAD – “Just checking some info about it”

PATH: the part of the URL after the host name

also know as “status line” HTTP_version status_code

reason_phrase HTTP/1.0 200 OK HTTP/1.1 404 Not Found

status codes: 100s – informational 200s – success of some kind 300s – redirect to another URL 400s – client error 500s – server error

Let’s run it from a web browser first ...

package com.beginningblackberry.networking;

import net.rim.device.api.ui.UiApplication;

public class NetworkingApplication extends UiApplication {

public NetworkingApplication() {NetworkingMainScreen scr = new

NetworkingMainScreen();pushScreen(scr);

}

public static void main(String[] args) {NetworkingApplication app = new

NetworkingApplication();app.enterEventDispatcher();

}}

package com.beginningblackberry.networking;import net.rim.device.api.ui.container.MainScreen;

public class NetworkingMainScreen extends MainScreen {private EditField urlField;private BitmapField imageOutputField;private RichTextField textOutputField;

.... methods on following slides

}

public NetworkingMainScreen() {

setTitle("Networking");urlField = new EditField("URL:", "");textOutputField = new RichTextField();imageOutputField = new BitmapField();

add(urlField); add(new SeparatorField());

postDataField = new EditField("Post data:", "");add(postDataField); add(new SeparatorField());

add(new LabelField("Image retrieved:"));add(imageOutputField); add(new SeparatorField());add(new LabelField("Text retrieved:"));add(textOutputField);

}

protected void makeMenu(Menu menu, int instance) {super.makeMenu(menu, instance);menu.add(new MenuItem("Get", 10, 10) {

public void run() {getURL();} }

);menu.add(new MenuItem("Post", 10, 10) {

public void run() {postURL();}}

);menu.add(new MenuItem("Socket Get", 10, 10) {

public void run() {socketGet();}}

);}

http://www.purpletech.com/talks/Threads.ppt

More on multi-threading (if you’re interested):

http://www.cs.uga.edu/~eileen/Concurrency_tutorials

You can learn about any component by looking at the API documentation.

See:http://www.blackberry.com/developers/docs/4.1api/index.htmlto learn more about the MenuItem component

private void getURL() {HttpRequestDispatcher dispatcher =

new HttpRequestDispatcher(urlField.getText(), "GET", this);dispatcher.start();

}

... creates a new thread for the network-related operation

... and starts it up

package com.beginningblackberry.networking;

/* * Class to handle creating the request, sending it off, * and receiving the response */

public class HttpRequestDispatcher extends Thread { private String url; private String method; // GET or POST private NetworkingMainScreen screen; private byte[] postData;...

}

public HttpRequestDispatcher(String url, String method, NetworkingMainScreen screen) { this.url = url; this.method = method; this.screen = screen; }

public HttpRequestDispatcher(String url, String method,NetworkingMainScreen screen, byte[] postData) {

this.url = url; this.method = method; this.screen = screen; this.postData = postData; }

public void run(){try{HttpConnection connection = (HttpConnection) Connector.open(url);

int responseCode = connection.getResponseCode();

if (responseCode != HttpConnection.HTTP_OK){screen.requestFailed(“Unexpected

response code: “ + responseCode); connection.close(); return; }...

String contentType = connection.getHeaderField(“Content-type”);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

InputStream responseData = connection.openInputStream();byte[] buffer = new byte[10000];

int bytesRead = responseData.read(buffer);while (bytesRead > 0){

baos.write(buffer, 0, bytesRead);bytesRead = responseData.read(buffer);

}baos.close();connection.close();screen.requestSucceeded(baos.toByteArray(), contentType);} catch (IOException ex){ screen.requestFailed(ex.toString());}}

public void requestSucceeded(byte[] result, String contentType) {if (contentType.equals("image/png") ||

contentType.equals("image/jpeg") ||contentType.equals("image/gif")) {

Bitmap bitmap = Bitmap.createBitmapFromBytes(result, 0, result.length, 1);

synchronized (UiApplication.getEventLock()) {imageOutputField.setBitmap(bitmap);

}}else if (contentType.startsWith("text/")) {

String strResult = new String(result);synchronized (UiApplication.getEventLock()) {textOutputField.setText(strResult);}

}else {

synchronized (UiApplication.getEventLock()) {Dialog.alert("Unknown content type: " + contentType);}

}}

public void requestFailed(final String message) {UiApplication.getUiApplication().invokeLater(new Runnable() {

public void run() {Dialog.alert("Request failed. Reason: " + message);

}});

}

}

.... and we’ve skipped some gory detail for now

See: http://beginningblackberry.appspot.com

Enter some words in the form – apple berry cinnamon doughnut

returns doughnut cinnamon berry apple

What’s in the web application?

<html> <head><title>Form</title></head><body><img src="img/apress_logo.png" /><br /> <form action="/" method="POST"><br /> <input type="text" name="content"></input> <input type="submit" value="Go!"/> </form> </body></html>

<form action="/" method="POST">- defines a form that the browser uses

to send data to the web application- send data to the ULR “/” (the base

URL )- using HTTP POST

<input type="text" name="content"></input>

defines the text boxgives it the name “content”

the application expects the content to be something like:

content = ONE+TWO+THREE“+” interpreted as a space

<input type="submit" value="Go!"/> defines the “Go” button as invoking

POST

</form> indicates end of the form

private byte[] postData;- to pass the POST body to the dispatcher

public HttpRequestDispatcher(String url, String method, NetworkingMainScreen screen, byte[] postData){

this.url = url;this.method = method;this.screen = screen;this.postData = postData;

}- constructor to initialize

if (method.equals(“POST”) && postData != null){connection.setRequestProperty(“Content-type”, “application/x-www-form-urlencoded”);

OutputStream requestOutput = connection.openOutputStream();

requestOutput.write(postData);requestOutput.close();

}

private void postURL(){ String postString = postDataField.getText();

URLEncodedPostData encodedData = new URLEncodedPostData(null, false);

encodedData.append(“content”, postString);

HttpRequestDispatcher dispatcher = new HttpRequestDispatcher(urlField.getText(), “

POST”, this, encodedData.getBytes());

dispatcher.start();}

let’s look at the code

explanation ... and let’s look at the code ...

private void socketGet() { SocketConnector connector = new

SocketConnector(urlField.getText(), this); connector.start(); }

private void postURL() { String postString = postDataField.getText(); URLEncodedPostData encodedData = new

URLEncodedPostData(null, false); encodedData.append("content", postString); HttpRequestDispatcher dispatcher = new

HttpRequestDispatcher(urlField .getText(), "POST", this, encodedData.getBytes()); dispatcher.start(); }