11 sending and receiving data communications dr. miguel a. labrador department of computer science...

26
Sending and Receiving Data Communications Dr. Miguel A. Labrador Department of Computer Science & Engineering [email protected] http://www.csee.usf.edu/~labrador

Upload: preston-moses-horn

Post on 17-Dec-2015

221 views

Category:

Documents


0 download

TRANSCRIPT

11

Sending and Receiving DataCommunications

Dr. Miguel A. Labrador

Department of Computer Science & Engineering

[email protected]

http://www.csee.usf.edu/~labrador

2Copyright© Dr. Miguel A. Labrador

2Copyright© Dr. Miguel A. Labrador

2

Outline

• The Generic Connection Framework• The MIDP• The Wireless Messaging API• Transport Layer Protocols• Examples

– TCP, UDP, HTTP, MMS

3Copyright© Dr. Miguel A. Labrador

3Copyright© Dr. Miguel A. Labrador

3

The Generic Connection Framework (GCF)

• General and extensible classes to support networking capabilities. – Included in the javax.microedition.io package– Includes the Connection interface, which is the foundation object for

all other communication interfaces implemented within the framework

• Connector object acts as a "factory" for creating new connection objects, i.e., instead of using different abstractions for specific forms of communications, a general abstraction is defined that does not define any type of network connection

– Static method open() of javax.microedition.io.Connector class is used to create all connections using a string as an input parameter that describes the target, as follows

4Copyright© Dr. Miguel A. Labrador

4Copyright© Dr. Miguel A. Labrador

4

GCF

• scheme: communication protocol, e.g., HTTP, TCP, UDP, etc.• target: user, password, host, port and URL of target device• param: param=values

{scheme}:[{target}][{params}]{scheme}://{user}{:password@}{host}{:port}{/url-path}{;parameters}

//HTTP Connection HTTPConnection client = (HTTPConnection)Connector.open("http://www.csee.usf.edu");

//Socket Connection SocketConnection client = (SocketConnection)Connector.open("socket://131.131.2.149:5555");

//Datagram Connection DatagramConnection client = (DatagramConnection)Connector.open("datagram://131.131.2.149:5556");

5Copyright© Dr. Miguel A. Labrador

5Copyright© Dr. Miguel A. Labrador

5

The Connection APIs• InputConnection and outputConnection

– Unidirectional serial communication– Implement the methods openInputStream, openDataInputStream,

openOutputStream, openOutputDataStream• StreamConnection

– Full duplex serial communication– Combination of the last two

• ContentConnection– Subtype of StreamConnection provides information for HTTP

connections such as content type, encoding, and length• StreamConnectionNotifier

– Waits for clients to request a stream connection– Starts a new StreamConnection to establish the connection

• DatagramConnetion– Input/output of datagrams– Implement methods, send, receive, getMaximumLength

6Copyright© Dr. Miguel A. Labrador

6Copyright© Dr. Miguel A. Labrador

6

Hierarchy of Connection Interface

7Copyright© Dr. Miguel A. Labrador

7Copyright© Dr. Miguel A. Labrador

7

The MIDP

• Provides second level of communication– More specific functionalities according to the individual capabilities and

resources of the mobile devices– TCP, UDP, and HTTP

• New elements included are:– SocketConnection: This interface, based on the StreamConnection,

implements a full duplex TCP communication between two devices– SocketServerConnection: This interface, based on the

StreamConnectionNotifier, implements the object that waits for TCP connection requests from clients, and creates a StreamConnection when the request is accepted

– UDPDatagramConnection: This interface, based on the DatagramConnection, implements the object that allows a communication using the UDP protocol

– HTTPConnection: This interface, based on the ContentConnection, implements the object that allows HTTP connections

8Copyright© Dr. Miguel A. Labrador

8Copyright© Dr. Miguel A. Labrador

8

TCP Client ExampleSocketConnection sockConn;

public void tcpSend() { String serverName = "131.131.2.149"; String serverPort = "5555"; //Send data via TCP if(sockConn == null){ try { sockConn = (SocketConnection)

Connector.open("socket://" + serverName + ":" + serverPort); }catch(IOException ex){ System.out.println("Could not create connection: " + ex); }

try { sockConn.setSocketOption(SocketConnection.KEEPALIVE, 1); }catch(IOException ex) { System.out.println("Could not set socket option: " + ex); }

9Copyright© Dr. Miguel A. Labrador

9Copyright© Dr. Miguel A. Labrador

9

TCP Client Example

try{outstream = sockConn.openOutputStream();

}catch(IOException ex){ System.out.println("Could not open socket stream: " + ex); } } // get the payload byte[] data = getPayload().getBytes(); try { outstream.write(data); }catch(IOException ex){ System.out.println("Could not write to socket stream: " + ex); } }

10Copyright© Dr. Miguel A. Labrador

10Copyright© Dr. Miguel A. Labrador

10

UDP Client ExampleUDPDatagramConnection dc;

public void udpSend() throws Exception { String serverName = "131.131.2.149"; String serverPort = "5555"; //Send data via UDP if(dc == null){ dc = (UDPDatagramConnection) Connector.open("datagram://" + serverName + ":" + serverPort); } byte[] data = getPayload().getBytes(); Datagram dg = dc.newDatagram(data, data.length); dc.send(dg); dc.close(); //You could leave UDP connection open to avoid overhead of //opening and closing connection repeatedly}

11Copyright© Dr. Miguel A. Labrador

11Copyright© Dr. Miguel A. Labrador

11

Generic (TCP/UDP) Server Examplepublic class ListenerManager { private static TCPTestServer theTCPServer; private static UDPTestReceiver theUDPReceiver; public static void initialize(){ try{ theTCPServer = new TCPTestServer(31686); theTCPServer.start(); try { theUDPReceiver = new UDPTestReceiver(2009, "lbsbook"); theUDPReceiver.start(); } catch (Exception ex) { Logger.getLogger

(ListenerManager.class.getName()).log(Level.SEVERE, null, ex); } }catch(IOException ioex){ System.err.println("Error initializing a TCPTestServer!"); ioex.printStackTrace(); } } public static void shutdown(){...}}

12Copyright© Dr. Miguel A. Labrador

12Copyright© Dr. Miguel A. Labrador

12

The TCPTestServer Class

public class TCPTestServer extends Thread {

private final int port; private ServerSocket serv_socket; private LinkedList<ConnectionDump> dump_list;

public TCPTestServer(int port) throws IOException { this.port = port; this.serv_socket = new ServerSocket(port);

// set blocking timeout for accept() call this.serv_socket.setSoTimeout(10*1000); this.dump_list = new LinkedList<ConnectionDump>();}

public void run(){ Socket tmp_socket = new Socket();

13Copyright© Dr. Miguel A. Labrador

13Copyright© Dr. Miguel A. Labrador

13

The TCPTestServer Class

while (this.serv_socket != null){ try{

// this blocks for 10 seconds. tmp_socket = this.serv_socket.accept(); if(tmp_socket.isConnected()){ this.dump_list.add(new ConnectionDump(tmp_socket)); }

}catch(IOException _){} finally{ tmp_socket = null; } }}

public void shutdown(){...}

protected class ConnectionDump extends Thread{...}}

14Copyright© Dr. Miguel A. Labrador

14Copyright© Dr. Miguel A. Labrador

14

The TCPTestServer Class

protected class ConnectionDump extends Thread{

Socket sock; InputStream instream; boolean active; public ConnectionDump(Socket sock){ this.sock = sock; if (sock.isConnected()){ try{ this.instream = sock.getInputStream(); }catch(IOException ioex){ System.err.println("Error getting inputstream for incoming connection."); ioex.printStackTrace(); } } this.active = true; this.start(); }

15Copyright© Dr. Miguel A. Labrador

15Copyright© Dr. Miguel A. Labrador

15

The TCPTestServer Class

public void run(){ while(active){ try{ byte[] b = new byte[124]; this.instream.read(b); // bytes read from the stream System.out.println("TCPTestServer - incoming string:" + new String(b)); }catch(IOException ioex){ System.err.println("Error reading from inputstream"); ioex.printStackTrace(); this.shutdown(); } } } public void shutdown() {...}} }

16Copyright© Dr. Miguel A. Labrador

16Copyright© Dr. Miguel A. Labrador

16

The UDPTestReceiver Class

public class UDPTestReceiver extends Thread{ DatagramSocket myUDPReceiver; boolean active = true; byte[] recBytes = new byte[150]; DatagramPacket receptorPacket = new DatagramPacket(recBytes,150); private String name; public UDPTestReceiver(int port, String name) throws Exception { myUDPReceiver = new DatagramSocket(port); myUDPReceiver.setSoTimeout(10*1000); this.name = name; }

17Copyright© Dr. Miguel A. Labrador

17Copyright© Dr. Miguel A. Labrador

17

The UDPTestReceiver Class public void run() { while(active) { try { myUDPReceiver.receive(receptorPacket); String receivedData = new String(receptorPacket.getData()); System.out.println(name+"UDP Received Data->"+receivedData); } catch(SocketTimeoutException e) {

} catch(Exception e) { System.out.println(name+" UDP receiver Exception: "+e); } } myUDPReceiver.close(); myUDPReceiver = null; } public boolean isActive(){...}

public void setActive(boolean active){...}}

18Copyright© Dr. Miguel A. Labrador

18Copyright© Dr. Miguel A. Labrador

18

HTTP Request Example

public class BasicBrowser extends MIDlet implements CommandListener {

private boolean midletPaused = false; private Command exitCommand; private Command okCommand; private Form form; private StringItem stringItem; private TextField textField; /** * The HelloMIDlet constructor. */ public HelloMIDlet() { }

19Copyright© Dr. Miguel A. Labrador

19Copyright© Dr. Miguel A. Labrador

19

HTTP Request Example

public void commandAction(Command command, Displayable displayable) { if (displayable == form) { if (command == exitCommand) { exitMIDlet(); } else if (command == okCommand) { try { Thread t = new Thread(){

public void run(){ try{ getSimplePage(textField.getString()); }catch(IOException ex){ ex.printStackTrace(); }

} }; t.start(); } catch(Exception e) { e.printStackTrace(); } } }}

20Copyright© Dr. Miguel A. Labrador

20Copyright© Dr. Miguel A. Labrador

20

HTTP Request Exampleprivate void getSimplePage(String url) throws IOException { StringBuffer buffer = new StringBuffer(); InputStream the_input_stream; HttpConnection the_connection; try { int i = 0; long tam = 0 ; int a_byte = 0; the_connection = (HttpConnection)Connector.open(url); the_input_stream = the_connection.openInputStream(); tam =the_connection.getLength(); if( tam != -1) { for(i = 0 ; i < tam ; i++ ) if((a_byte = the_input_stream.read()) != -1) { buffer.append((char) a_byte); } stringItem.setText("\n The code of the webpage is:\n" + buffer.toString()); } else { stringItem.setText("\n Sorry but the entered URL is not supported."); } } finally { the_input_stream.close(); the_connection.close(); }}

21Copyright© Dr. Miguel A. Labrador

21Copyright© Dr. Miguel A. Labrador

21

The Wireless Messaging API (WMA)• Messaging capability to mobile devices using the cellular network• Short Messaging Service (SMS)

– Exchanges text-only messages• Multimedia Messaging Service (MMS),

– Extends the capabilities of the SMS messages by allowing embedded multimedia content in the message

• WMA main components:– MessageConnection: Interface based on the basic Connection

interface that creates the connection between two devices and allows the transmission of a message

– Message: This interface is designed to model a basic message object. The WMA defines three different types of messages:

• BynaryMessage: A message with a binary array of data• TextMessage: A text message• MultipartMessage: A message that can carry also multimedia content, or

a MMS message

22Copyright© Dr. Miguel A. Labrador

22Copyright© Dr. Miguel A. Labrador

22

The Wireless Messaging API (WMA)

• WMA main components:– MessagePart: Models the individual sections of a MultipartMessage

object• This object contains the definition of the message content according to the

MIME standard and the data related to the content, either binary or text– MessageListener: Defines a mechanism to notify that a new

message has arrived• Acknowledges the independence between the notification of the arrival of

a message and the actual reception of the message that includes bringing the information to the device in order to avoid blocking the MessageListener from other notifications

• Addressing in the messaging domain is different– Destination address in a SMS messages is identified by the phone

number registered in the SIM card of the phone– In the case of MMS messages, the destination address can assume

multiple formats: an email address, phone number, IPv4 or IPv6 IP addresses

23Copyright© Dr. Miguel A. Labrador

23Copyright© Dr. Miguel A. Labrador

23

Addressing in WMA• In both, SMS and MMS messages a parameter is important to

define the communication port that will receive the message– SMS uses numeric port– MMS uses a 32 character long string

– getAppProperty() method obtains values from parameters of the application defined in the JAD file

String appID = getAppProperty("MmsAppID");String address = "mms://+555123456:" + appID;int sms_port = getAppProperty("SmsAppCommPort");

//SMS message(MessageConnection)Connector.open ("sms://+555123456"+sms_port);

//MMS message(MessageConnection)Connector.open (address);

SmsAppCommPort: 51234MmsAppID: wma_example_app

24Copyright© Dr. Miguel A. Labrador

24Copyright© Dr. Miguel A. Labrador

24

The WMA Hierarchy

25Copyright© Dr. Miguel A. Labrador

25Copyright© Dr. Miguel A. Labrador

25

MMS Examplefinal public void sendMessage(

Thread th = new Thread() {public void run(){

MessageConnection connection=null; String appID = getAppProperty("MmsAppID"); try { String address="mms://[email protected]"; //Establishing connection connection=(MessageConnection)Connector.open("mms://:"+appID); //Create a multipart message MultipartMessage message=(MultipartMessage)

connection.newMessage(MessageConnection.MULTIPART_MESSAGE, address);

message.setSubject("LOCATIONUPDATE"); MessagePart locationPart=new MessagePart(getLocationInfo().getBytes(), "text/html", "id:2", "text", null); message.addMessagePart(locationPart); connection.send(message); }catch(Exception e){ //Handle exception}

26Copyright© Dr. Miguel A. Labrador

26Copyright© Dr. Miguel A. Labrador

26

MMS Example

if(connection!=null) { try { connection.close(); }catch(Exception e){//Handle exception} } }

};th.start();

}