Zurück zu Googles Android

Die erste Frage, die sich bei der Betrachtung von TCP bei Android stellt, ist: Haben Sie schon mal Sockets in Java programmiert? Wenn die Antwort „Ja“ lautet, dann herzlichen Glückwunsch. Sie brauchen sich das Kapitel über TCP-Sockets in Android nicht anschauen, da Android exakt die gleichen Java-Klassen und Strukturen zum Erzeugen von Sockets benutzt und sie somit schon alles kennen.

Da dieses Buch aber so vollständig wie möglich sein soll, möchten wir nicht so sein und erklären hier, wie Sie TCP-Sockets auf der Client- und der Server-Seite in Android implementieren können, um eine Verbindung zwischen Geräten herstellen zu können.

Client Bearbeiten


Socket client;

try{
   client = new Socket("www.example.com", 4321);
   out = new PrintWriter(client.getOutputStream(),true);
   in = new BufferedReader(new InputStreamReader(client.getInputStream()));

} catch(UnknownHostException e) {
   System.out.println("Unknown host: www.example.com");

} catch(IOException e) {
   System.out.println("No I/O");
}

Um einen Socket auf der Client-Seite zu öffnen wird einfach ein Socket[1]-Objekt erstellt. Diesem wird die Server-Adresse in Form einer URL oder auch einer IP-Adresse und die Portnummer, auf der der Socket arbeitet, übergeben. Sollte auf der angegebenen Adresse bzw. dem Port kein anderer Socket vorhanden sein, wird eine UnkownHostException[2] ausgegeben.

Wenn der Socket auf der anderen Seite existiert, dann lassen sich von diesem der Input- und Outputstream bestimmen, um auf dem Socket Daten zu senden und zu empfangen.

Server Bearbeiten

ServerSocket server;

try{
   server = new ServerSocket(4321); 
} catch (IOException e) {
   System.out.println("Could not listen on port 4321");
}

Socket client;

try{
   client = server.accept();
} catch (IOException e) {
   System.out.println("Accept failed: 4321");
}

try{
   in = new BufferedReader(new InputStreamReader(client.getInputStream()));
   out = new PrintWriter(client.getOutputStream(),true);
} catch (IOException e) {
   System.out.println("Read failed");
}

Das Manifest Bearbeiten

Im Manifest wird dann nur noch folgender Eintrag benötigt, um die Berechtigung zu erhalten, Netzwerk übergreifende Dienste nutzen zu können:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Besonderheiten Emulatorbetrieb Bearbeiten

Fest definierte Emulator-IP-Adressen[3]
Adresse Funktion
127.0.0.1 Abhängig davon, in welchem Netzwerk ein Programm läuft (Emulator oder Rechner)
10.0.2.1 IP-Adresse des Routers (Gateway-Adresse)
10.0.2.2 IP-Adresse des Rechners, auf dem der Emulator läuft (Entwicklungsrechner)
10.0.2.15 IP-Adresse des Emulators
10.0.2.3 Erster DNS-Server des Routers
10.0.2.4–6 Weitere DNS-Server des Routers


Für den Socket auf der Server-Seite ist ein Schritt mehr zu machen als auf der Client-Seite. So muss zuerst ein ServerSocket[4]-Objekt erstellt werden, welcher auf dem gewünschten Port arbeitet. Dieser ServerSocket wartet durch den Aufruf der Methode accept()[5] auf eine eingehende Verbindung eines anderen Sockets. Kommt so eine Verbindung zustande, gibt accept() ein Socket-Objekt zurück, auf dem man, wie im Client-Abschnitt, arbeiten kann. Das heißt, dass man durch den Abruf der Input- und Outputstreams Daten zwischen den beiden Sockets senden kann.

Einzelnachweis Bearbeiten

  1. Socket: http://developer.android.com/reference/java/net/Socket.html. Stand 05. März 2011
  2. UnkownHostException: http://developer.android.com/reference/java/net/UnknownHostException.html. Stand 05. März 2011
  3. Android Grundlagen und Programmierung, 1. Auflage 2009, dpunkt.verlag GmbH, ISBN 978-3-89864-574-4.
  4. ServerSocket: http://developer.android.com/reference/java/net/ServerSocket.html. Stand 05. Stand 2011
  5. http://developer.android.com/reference/java/net/ServerSocket.html#accept%28%29. Stand 05. März 2011