[J2ME] SSL connections to http/mail servers using Java

I want to connect to mail(pop/imap) and/or HTTP servers over secure sockets layer. I am seeing multiple options to do so. Anybody ventured into this? Whats the best way to do this in a J2me mobile app? Any low level explanation will be helpful.

Some options
1) https
2) javax.microedition.io.secureconnection

 

j2me secure socket connection code: Here is a solution from the Corej2ME book (thanks to @daaku for the lead). Although this is not a complete code, this can pretty much be the starting point of a https based connection in J2ME

[code]

<span style="color: #3f7f5f;">/*--------------------------------------------------</span>
<span style="color: #3f7f5f;">* ViewFile.java</span>
<span style="color: #3f7f5f;">*</span>
<span style="color: #3f7f5f;">* Send client request (method, header, body)</span>
<span style="color: #3f7f5f;">* Get server response (status, header, body)</span>
<span style="color: #3f7f5f;">*</span>
<span style="color: #3f7f5f;">* Example from the book: Core J2ME Technology</span>
<span style="color: #3f7f5f;">* Copyright John W. Muchow <a href="http://www.corej2me.com/" target="_blank">http://www.CoreJ2ME.com</a></span>
<span style="color: #3f7f5f;">* You may use/modify for any non-commercial purpose</span>
<span style="color: #3f7f5f;">*-------------------------------------------------*/</span>
<span style="color: #7f0055;">import </span><span style="color: #000000;">javax.microedition.midlet.*;</span>
<span style="color: #7f0055;">import </span><span style="color: #000000;">javax.microedition.io.*;</span>
<span style="color: #7f0055;">import </span><span style="color: #000000;">java.io.*;</span>

<span style="color: #7f0055;">public class </span><span style="color: #000000;">ViewFile </span><span style="color: #7f0055;">extends </span><span style="color: #000000;">MIDlet</span>
<span style="color: #000000;">{</span>
<span style="color: #7f0055;">private </span><span style="color: #000000;">String url = </span><span style="color: #2a00ff;">"http://www.corej2me.com/midpbook_v1e1/ch14/getHeaderInfo.txt"</span><span style="color: #000000;">;</span>

<span style="color: #7f0055;">public </span><span style="color: #7f0055;">void </span><span style="color: #000000;">startApp</span><span style="color: #000000;">()</span>
<span style="color: #000000;">{</span>
<span style="color: #7f0055;">try</span>
<span style="color: #000000;">{</span>
<span style="color: #000000;">processRequest</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>
<span style="color: #7f0055;">catch </span><span style="color: #000000;">(</span><span style="color: #000000;">Exception e</span><span style="color: #000000;">)</span>
<span style="color: #000000;">{</span>
<span style="color: #000000;">System.err.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Msg: " </span><span style="color: #000000;">+ e.toString</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>
<span style="color: #000000;">} </span>

<span style="color: #7f0055;">private </span><span style="color: #7f0055;">void </span><span style="color: #000000;">processRequest</span><span style="color: #000000;">() </span><span style="color: #7f0055;">throws </span><span style="color: #000000;">IOException</span>
<span style="color: #000000;">{</span>
<span style="color: #000000;">HttpConnection http = </span><span style="color: #7f0055;">null</span><span style="color: #000000;">;</span>
<span style="color: #000000;">InputStream iStrm = </span><span style="color: #7f0055;">null</span><span style="color: #000000;">;</span>

<span style="color: #7f0055;">try</span>
<span style="color: #000000;">{</span>
<span style="color: #3f7f5f;">// Create the connection</span>
<span style="color: #000000;">http = </span><span style="color: #000000;">(</span><span style="color: #000000;">HttpConnection</span><span style="color: #000000;">) </span><span style="color: #000000;">Connector.open</span><span style="color: #000000;">(</span><span style="color: #000000;">url</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>

<span style="color: #3f7f5f;">//----------------</span>
<span style="color: #3f7f5f;">// Client Request</span>
<span style="color: #3f7f5f;">//----------------</span>
<span style="color: #3f7f5f;">// 1) Send request method</span>
<span style="color: #000000;">http.setRequestMethod</span><span style="color: #000000;">(</span><span style="color: #000000;">HttpConnection.GET</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>

<span style="color: #3f7f5f;">// 2) Send header information (this header is optional)</span>
<span style="color: #000000;">http.setRequestProperty</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"User-Agent"</span><span style="color: #000000;">, </span><span style="color: #2a00ff;">"Profile/MIDP-1.0 Configuration/CLDC-1.0"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #3f7f5f;">// http.setRequestProperty("If-Modified-Since", "Mon, 16 Jul 2001 22:54:26 GMT");</span>

<span style="color: #3f7f5f;">// If you experience IO problems, try </span>
<span style="color: #3f7f5f;">// removing the comment from the following line</span>
<span style="color: #3f7f5f;">//http.setRequestProperty("Connection", "close"); </span>

<span style="color: #3f7f5f;">// 3) Send body/data - No data for this request</span>

[/code]

 

Server code

[code]

<span style="color: #3f7f5f;">// Server Response</span>
<span style="color: #3f7f5f;">//----------------</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"url: " </span><span style="color: #000000;">+ url</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"-------------------------"</span><span style="color: #000000;">)</span><span style="color: #000000;">; </span>

<span style="color: #3f7f5f;">// 1) Get status Line</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Msg: " </span><span style="color: #000000;">+ http.getResponseMessage</span><span style="color: #000000;">())</span><span style="color: #000000;">; </span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Code: " </span><span style="color: #000000;">+ http.getResponseCode</span><span style="color: #000000;">())</span><span style="color: #000000;">; </span>

<span style="color: #3f7f5f;">// 2) Get header information </span>
<span style="color: #7f0055;">if </span><span style="color: #000000;">(</span><span style="color: #000000;">http.getResponseCode</span><span style="color: #000000;">() </span><span style="color: #000000;">== HttpConnection.HTTP_OK</span><span style="color: #000000;">)</span>
<span style="color: #000000;">{</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"field 0: " </span><span style="color: #000000;">+ http.getHeaderField</span><span style="color: #000000;">(</span><span style="color: #990000;">0</span><span style="color: #000000;">))</span><span style="color: #000000;">; </span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"field 1: " </span><span style="color: #000000;">+ http.getHeaderField</span><span style="color: #000000;">(</span><span style="color: #990000;">1</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"field 2: " </span><span style="color: #000000;">+ http.getHeaderField</span><span style="color: #000000;">(</span><span style="color: #990000;">2</span><span style="color: #000000;">))</span><span style="color: #000000;">; </span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"-------------------------"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"key 0: " </span><span style="color: #000000;">+ http.getHeaderFieldKey</span><span style="color: #000000;">(</span><span style="color: #990000;">0</span><span style="color: #000000;">))</span><span style="color: #000000;">; </span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"key 1 : " </span><span style="color: #000000;">+ http.getHeaderFieldKey</span><span style="color: #000000;">(</span><span style="color: #990000;">1</span><span style="color: #000000;">))</span><span style="color: #000000;">; </span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"key 2: " </span><span style="color: #000000;">+ http.getHeaderFieldKey</span><span style="color: #000000;">(</span><span style="color: #990000;">2</span><span style="color: #000000;">))</span><span style="color: #000000;">; </span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"-------------------------"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"content: " </span><span style="color: #000000;">+ http.getHeaderField</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"content-type"</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"date: " </span><span style="color: #000000;">+ http.getHeaderField</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"date"</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"last-modified: " </span><span style="color: #000000;">+ http.getHeaderField</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"last-modified"</span><span style="color: #000000;">))</span><span style="color: #000000;">; </span>

<span style="color: #3f7f5f;">// 3) Get data (show the file contents)</span>
<span style="color: #000000;">String str;</span>
<span style="color: #000000;">iStrm = http.openInputStream</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span>
<span style="color: #7f0055;">int </span><span style="color: #000000;">length = </span><span style="color: #000000;">(</span><span style="color: #7f0055;">int</span><span style="color: #000000;">) </span><span style="color: #000000;">http.getLength</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span>
<span style="color: #7f0055;">if </span><span style="color: #000000;">(</span><span style="color: #000000;">length != -</span><span style="color: #990000;">1</span><span style="color: #000000;">)</span>
<span style="color: #000000;">{</span>
<span style="color: #3f7f5f;">// Read data in one chunk</span>
<span style="color: #7f0055;">byte </span><span style="color: #000000;">serverData</span><span style="color: #000000;">[] </span><span style="color: #000000;">= </span><span style="color: #7f0055;">new </span><span style="color: #7f0055;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">length</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span>
<span style="color: #000000;">iStrm.read</span><span style="color: #000000;">(</span><span style="color: #000000;">serverData</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">str = </span><span style="color: #7f0055;">new </span><span style="color: #000000;">String</span><span style="color: #000000;">(</span><span style="color: #000000;">serverData</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>
<span style="color: #7f0055;">else </span><span style="color: #3f7f5f;">// Length not available...</span>
<span style="color: #000000;">{</span>
<span style="color: #000000;">ByteArrayOutputStream bStrm = </span><span style="color: #7f0055;">new </span><span style="color: #000000;">ByteArrayOutputStream</span><span style="color: #000000;">()</span><span style="color: #000000;">; </span>

<span style="color: #7f0055;">int </span><span style="color: #000000;">ch;</span>
<span style="color: #7f0055;">while </span><span style="color: #000000;">((</span><span style="color: #000000;">ch = iStrm.read</span><span style="color: #000000;">()) </span><span style="color: #000000;">!= -</span><span style="color: #990000;">1</span><span style="color: #000000;">)</span>
<span style="color: #000000;">bStrm.write</span><span style="color: #000000;">(</span><span style="color: #000000;">ch</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>

<span style="color: #000000;">str = </span><span style="color: #7f0055;">new </span><span style="color: #000000;">String</span><span style="color: #000000;">(</span><span style="color: #000000;">bStrm.toByteArray</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span>
<span style="color: #000000;">bStrm.close</span><span style="color: #000000;">()</span><span style="color: #000000;">; </span>
<span style="color: #000000;">}</span>

<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"File Contents: " </span><span style="color: #000000;">+ str</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>

<span style="color: #3f7f5f;">//-----------------------------</span>
<span style="color: #3f7f5f;">// Show connection information</span>
<span style="color: #3f7f5f;">//-----------------------------</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Host: " </span><span style="color: #000000;">+ http.getHost</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Port: " </span><span style="color: #000000;">+ http.getPort</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span>
<span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Type: " </span><span style="color: #000000;">+ http.getType</span><span style="color: #000000;">())</span><span style="color: #000000;">; </span>

<span style="color: #000000;">}</span>
<span style="color: #000000;">}</span><span style="color: #7f0055;">catch</span><span style="color: #000000;">(</span><span style="color: #000000;">Exception e</span><span style="color: #000000;">){</span>
<span style="color: #000000;">e.printStackTrace</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span>

<span style="color: #000000;">}</span><span style="color: #7f0055;">finally</span><span style="color: #000000;">{</span>
<span style="color: #3f7f5f;">// Clean up</span>
<span style="color: #7f0055;">if </span><span style="color: #000000;">(</span><span style="color: #000000;">iStrm != </span><span style="color: #7f0055;">null</span><span style="color: #000000;">)</span>
<span style="color: #000000;">iStrm.close</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span>
<span style="color: #7f0055;">if </span><span style="color: #000000;">(</span><span style="color: #000000;">http != </span><span style="color: #7f0055;">null</span><span style="color: #000000;">)</span>
<span style="color: #000000;">http.close</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>
<span style="color: #000000;">}</span>

<span style="color: #7f0055;">public </span><span style="color: #7f0055;">void </span><span style="color: #000000;">pauseApp</span><span style="color: #000000;">(){}</span>

<span style="color: #7f0055;">public </span><span style="color: #7f0055;">void </span><span style="color: #000000;">destroyApp</span><span style="color: #000000;">(</span><span style="color: #7f0055;">boolean </span><span style="color: #000000;">unconditional</span><span style="color: #000000;">){ }</span>
<span style="color: #000000;">} </span>

[/code]

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>