1 / 48

Creating Network-Enabled Applications

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

nuncio
Download Presentation

Creating Network-Enabled Applications

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CSCI 7010 UGA March 23rd, 2010 Creating Network-Enabled Applications

  2. Ways to Connect • BES/MDS • TCP/IP • BIS • WiFi • WAP 2.0 • WAP 1.0

  3. 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 • lets the Blackberry device make a secure connection to corporate servers

  4. TCP/IP • Transmission Control Protocol/Internet Protocol • a “regular” internet connection • works with most devices

  5. BIS • 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

  6. WiFi • 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

  7. WAP 2.0 • Wireless Access Protocol • connects through wireless carrier’s WAP gateway • no Blackberry-specific infrastructure • but user’s plan must support WAP 2.0 (most do) • don’t need to configure as with TCP/IP

  8. WAP 1.0 • older version of WAP • supported by all Blackberry devices • but doesn’t support secure connections as do other methods

  9. So many choices ... • 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

  10. The “Service Book” • how the device maintains info about its configuration • records about optional applications • email account configuration • connection methods available on a device

  11. Service Book • open device Options • click Advanced Options • Service Book • Demo on the simulator

  12. Service Book records • Two parts: • CID – defines the type of record • UID – a unique identifier • most connection methods have a record in the service book

  13. The Connector class • 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”);

  14. In general ... • Connection_type connectionName= (Connection_type) Connector.open(URL); • Connection_type is some subclass of Connection • connectionName is a variable name that you choose • URL takes the form scheme://host:port/path[optional parameters] • Example URLs: • file://myfile.html • http://www.apress.com:80/book/catalog • socket://www.apress.com:80 • https://www.amazon.com/gp/flex/sign-in/select.html

  15. HTTP Basics • Hypertext transfer protocol • protocol of the World Wide Web • connectionless • request-response

  16. http client • opens a connection to an http server • sends a request message • receives the response • displays result

  17. http server • listens for a connection from client • receives a request • delivers a response • closes the connection

  18. http message • initial line (different for request & response) • header lines (zero or more) • blank line • optional message body

  19. initial request line • 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

  20. initial response line • also know as “status line” • HTTP_versionstatus_codereason_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

  21. The Sample Application • Let’s run it from a web browser first ...

  22. NetworkingApplication.java package com.beginningblackberry.networking; import net.rim.device.api.ui.UiApplication; public class NetworkingApplication extends UiApplication { public NetworkingApplication() { NetworkingMainScreenscr = new NetworkingMainScreen(); pushScreen(scr); } public static void main(String[] args) { NetworkingApplication app = new NetworkingApplication(); app.enterEventDispatcher(); } }

  23. NetworkingMainScreen.java 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 }

  24. Constructor 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); }

  25. Creating a menu 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();} } ); }

  26. Threads http://www.purpletech.com/talks/Threads.ppt More on multi-threading (if you’re interested): http://www.cs.uga.edu/~eileen/Concurrency_tutorials

  27. MenuItem, in more detail • You can learn about any component by looking at the API documentation. See: http://www.blackberry.com/developers/docs/4.1api/index.html to learn more about the MenuItem component

  28. When the user clicks “Get” 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

  29. HttpRequestDispatcher 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; ... }

  30. Constructors 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; }

  31. run() – simple version public void run(){ try{ HttpConnection connection = (HttpConnection) Connector.open(url); intresponseCode = connection.getResponseCode(); if (responseCode != HttpConnection.HTTP_OK){ screen.requestFailed(“Unexpected response code: “ + responseCode); connection.close(); return; } ...

  32. run() – simple version, continued String contentType = connection.getHeaderField(“Content-type”); ByteArrayOutputStreambaos = new ByteArrayOutputStream(); InputStreamresponseData = connection.openInputStream(); byte[] buffer = new byte[10000]; intbytesRead = 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()); } }

  33. requestSucceeded(...) 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); } } }

  34. requestFailed(...) public void requestFailed(final String message) { UiApplication.getUiApplication().invokeLater (new Runnable() { public void run() { Dialog.alert("Request failed. Reason: " + message); } }); } }

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

  36. Let’s run the web application from a browser again ... • See: http://beginningblackberry.appspot.com • Enter some words in the form – • apple berry cinnamon doughnut • returns • doughnut cinnamon berry apple

  37. Two-way interaction:Sending data with HTTP POST • 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>

  38. <form> <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

  39. <input> • <input type="text" name="content"></input> • defines the text box • gives it the name “content” • the application expects the content to be something like: • content = ONE+TWO+THREE • “+” interpreted as a space

  40. <input type="submit" value="Go!"/> • defines the “Go” button as invoking POST • </form> • indicates end of the form

  41. Modified HttpRequestDispatcher 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

  42. check for POST data before sending if (method.equals(“POST”) && postData != null){ connection.setRequestProperty(“Content-type”, “application/x-www-form-urlencoded”); OutputStream requestOutput = connection.openOutputStream(); requestOutput.write(postData); requestOutput.close(); }

  43. postURL 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(); }

  44. ... stop here today ...

  45. HEAD • let’s look at the code

  46. Socket Basics • explanation • ... and let’s look at the code ...

  47. private void socketGet() { • SocketConnector connector = new SocketConnector(urlField.getText(), this); • connector.start(); • } • private void postURL() { • String postString = postDataField.getText(); • URLEncodedPostDataencodedData = new URLEncodedPostData(null, false); • encodedData.append("content", postString); • HttpRequestDispatcher dispatcher = new HttpRequestDispatcher(urlField • .getText(), "POST", this, encodedData.getBytes()); • dispatcher.start(); • }

More Related