/*
* ConnectThread.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings. However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies. For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/
package com.rim.samples.device.socketdemo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import net.rim.device.api.ui.UiApplication;
/**
* A thread class to handle communication with the server component.
*/
public class ConnectThread extends Thread {
private InputStream _in;
private OutputStreamWriter _out;
private final SocketDemoScreen _screen;
/**
* Creates a new ConnectThread object
*/
public ConnectThread() {
_screen = ((SocketDemo) UiApplication.getUiApplication()).getScreen();
}
/**
* Pass some data to the server and wait for a response.
*
* @param data
* The data to send.
*/
private void exchange(final String data) throws IOException {
// Cache the length locally for better efficiency.
final int length = data.length();
// Create an input array just big enough to hold the data
// (we're expecting the same string back that we send).
final char[] input = new char[length];
_out.write(data, 0, length);
// Read character by character into the input array.
for (int i = 0; i < length; ++i) {
input[i] = (char) _in.read();
}
// Hand the data to the parent class for updating the GUI. By explicitly
// creating the stringbuffer we can save a few object creations.
final StringBuffer s = new StringBuffer();
s.append("Received: ");
s.append(input, 0, length);
_screen.updateDisplay(s.toString());
}
/**
* Implementation of Thread.
*/
public void run() {
StreamConnection connection = null;
try {
_screen.updateDisplay("Opening Connection...");
final String url =
"socket://" + _screen.getHostFieldText() + ":44444"
+ (_screen.isDirectTCP() ? ";deviceside=true" : "");
connection = (StreamConnection) Connector.open(url);
_screen.updateDisplay("Connection open");
_in = connection.openInputStream();
_out = new OutputStreamWriter(connection.openOutputStream());
// Send the HELLO string.
exchange("Hello");
// Execute further data exchange here...
// Send the GOODBYE string.
exchange("Goodbye and farewell");
_screen.updateDisplay("Done!");
} catch (final IOException e) {
System.err.println(e.toString());
} finally {
_screen.setThreadRunning(false);
try {
_in.close();
} catch (final IOException ioe) {
}
try {
_out.close();
} catch (final IOException ioe) {
}
try {
connection.close();
} catch (final IOException ioe) {
}
}
}
}