Anwendungsbeispiel

Das Anwendungsbeispiel konzentriert sich darauf, eine Netzwerkfunktionalität zwischen dem Spieler (Client) und dem Rechner (Server) herzustellen. Hierzu sollen Sockets verwendet werden. Der Datenaustausch soll mittels TCP erfolgen. Im Folgenden müssen daher drei Systemkomponenten betrachtet werden: Die Implementierungen von Server und Client sowie das Protokoll, mittels dessen Daten ausgetauscht werden. Das Protokoll ist in diesem Fall sehr einfach: Es sind die Spielregeln des Spiels Schiffe versenken. Zunächst wird die Implementierung des Servers vorgestellt.

code 

import java.net.*;
import java.io.*;
public class SVServer {

    public static void main(String[] args) throws IOException {

      String sendeZeile, empfangsZeile;
      //Initialisierung des Protokolls
      SVprotocol svp = new SVprotocol();
      ServerSocket serverSocket = null;
      try {

        serverSocket = new ServerSocket(4444);

      } catch (IOException e) {

        System.err.println("Port nicht verfügbar: 4444.");
        System.exit(1);

      }
      Socket clientSocket = null;
      try {

        clientSocket = serverSocket.accept();

      } catch (IOException e) {

        System.err.println("Accept fehlgeschlagen.");
        System.exit(1);

      }

      PrintWriter senden = new PrintWriter(clientSocket.getOutputStream(), true);
      BufferedReader empfangen= new BufferedReader(new InputStreamReader(clientSocket.getInputStream()) );

      //Nun zum Spielablauf
      while ((empfangsZeile = empfangen.readLine()) != null) {

        System.out.println("Client schickt: "+empfangsZeile );
        sendeZeile = svp.verarbeiten(empfangsZeile);
        senden.println(sendeZeile);
        //Spiel beendet?
        if (sendeZeile.equals("Bye."))

          break;

      }
      senden.close();
      empfangen.close();
      clientSocket.close();
      serverSocket.close();

    }

}

Die Funktionsweise des Clients sollte dem Leser unmittelbar klar sein, da hierzu lediglich das Programmbeispiel der Verwendung von Sockets derart modifiziert wurde, dass der Protokollablauf integriert wurde. Der Client baut zunächst eine Socket-Verbindung auf und schickt über diese dann Daten. Nachdem das Spiel beendet ist, werden die Sockets und die Streams wieder geschlossen. Auch der im Folgenden angegeben Client arbeitet nach diesem Prinzip.

code 

import java.io.*;
import java.net.*;
public class SVClient {

    public static void main(String[] args) throws IOException {

      String sendeZeile, empfangsZeile;
      SVprotocol svp = new SVprotocol();
      Socket SVSocket = null;
      PrintWriter senden = null;
      BufferedReader empfangen= null;
      try {

        SVSocket = new Socket("localhost", 4444);
        senden = new PrintWriter(SVSocket.getOutputStream(), true);
        empfangen = new BufferedReader(new InputStreamReader(SVSocket.getInputStream() ));

      } catch (UnknownHostException e) {

        System.err.println("Host unbekannt: plato.");
        System.exit(1);

      } catch (IOException e) {

        System.err.println("I/O zu localhost abgelehnt.");
        System.exit(1);

      }
      //Spieler faengt immer an
      sendeZeile = svp.begin();
      senden.println(sendeZeile);

      //Nun zum Spielablauf
      while ((empfangsZeile = empfangen.readLine()) != null) {

        System.out.println("Server schickt: "+empfangsZeile);
        sendeZeile = svp.verarbeiten(empfangsZeile);
        senden.println(sendeZeile);
        if (sendeZeile.equals("Bye."))

          break;

      }

      senden.close();
      empfangen.close();
      SVSocket.close();

    }

}

Die Funktionsweise des Clients ist ebenfalls ähnlich zu der des Socket-Beispiels. Hier sei darauf hingewiesen, dass eine Verbindung zum Rechner localhost aufgebaut wird. Auch in dieser Implementierung wird das Protokoll integriert.

Das im Folgenden betrachtete Protokoll ist nur rudimentär realisiert. Ziel ist es hierbei, dass nur ein Container zur Verfügung steht, in den die gesamte Spiellogik integriert werden kann. Das Protokoll ist wie folgt realisiert:

code 

public class SVprotocol {

    public  SVprotocol ()  { }
    public String begin() {

      return "Start des Spiels";

    }
    public String verarbeiten (String input) {

      String output;
      return "Bye.";

    }

}

Mittels der Methode begin wird es dem Client ermöglicht, ein Spiel zu beginnen. Die Methode verarbeiten wird von Server und Client dazu verwendet, Treffer festzustellen und festzulegen, welcher Spieler als nächstes an der Reihe ist.


SPNavRight SPNavRight SPNavRight
BuiltByNOF