Facharbeit Informatik - Die Funktionsweise eines Servers

  • Published on
    04-Aug-2015

  • View
    532

  • Download
    1

DESCRIPTION

Facharbeit in der Stufe 12 des Gymnasiums.Die Funktionsweise eines Servers in Java am Beispiel eines Wettbewerbsystems von Othello

Transcript

Theodor-Heuss-Gymnasium

Jahrgangsstufe 12, 2. Hj

FACHARBEIT im Grundkurs Informatik bei

Die Funktionsweise eines ServersRealisierung eines netzwerkbasierten Wettbewerbssystems am Beispiel von Othello

Verfasser: Jahrgangsstufe: 12 Schuljahr: Kursleiter: 2011/12

-2-

Inhaltsverzeichnis1 Einleitung.......................................................................................................................3 2 Othello...........................................................................................................................3 2.1 Aufbau und Spielregeln...........................................................................................3 2.2 Beispiele fr Spielsituationen..................................................................................4 3 Der Server......................................................................................................................5 3.1 Die Anmeldung........................................................................................................6 3.1.1 Der direkte Weg zum Server..............................................................................6 3.1.2 Mit dem Broadcast zum Server..........................................................................8 3.2 Die Vorbereitungen vor dem Spiel Organisation................................................17 3.3 Das Protokoll.........................................................................................................19 3.3.1 Der erste Kontakt.............................................................................................20 3.3.2 Das Spiel..........................................................................................................20 3.3.3 Die Ergebnisse.................................................................................................22 4 Schluss.........................................................................................................................23 5 Literaturverzeichnis.....................................................................................................24 6 Abbildungsverzeichnis.................................................................................................24 7 Anhang.........................................................................................................................25 7.1 UML Diagramm..................................................................................................25

-2-

-3-

1 EinleitungIch werde mich in dieser Facharbeit mit einem Wettbewerbs- und Rankingsystem auf Netzwerkbasis anhand von Othello befassen. Prziser formuliert handelt es sich um ein Client-Server System, das die einzelnen Spiele aller Beteiligten organisiert, durchfhrt und auswertet. Der Anwendungsbereich knnte hierbei z.B. bei einem Wettbewerb fr Schachcomputer oder bei meinem Beispiel Othelloturnier liegen. Dabei wird besonderer Wert auf die Kommunikation und Verwaltung in JAVA in der Version 6 gelegt. Das heit Ziel wird die Entwicklung und die genaue Erluterung des Netzwerkprotokolls, sowie die Organisation der Clients im Server und der Datenerhebung fr die Auswertung und Bewertung aller Clients sein. Der Client wird eine untergeordnete Rolle spielen und in groen Stcken als gegeben betrachtet, soweit dies nicht zum allgemeinen Verstndnis notwendig sein sollte. Die Facharbeit wird zunchst die Grundzge des Spielablaufes klren, um anschlieend Aufbau und genaue Realisierung des Servers zu beschreiben, wobei auf Probleme bei der Programmierung der einzelnen Aufgabenbereiche hingewiesen wird.

2 OthelloIn diesem Kapitel mchte ich eine kurze Einfhrung zu dem 1971 aus Reversi hervorgegangenem Spiel Othello geben und den Aufbau, sowie die Spielregeln und den Spielverlauf im Allgemeinen klren. Auerdem werden einige Besonderheiten an konkreten Spielsituationen erklrt.

2.1 Aufbau und SpielregelnDas Spielfeld besteht aus einem 8x8 Felder messendem Brett (z.B Schachbrett). Gespielt wird mit zwei Spielern und Spielsteinen in zwei Farben. Das heit eine Seite eines Spielsteins ist schwarz, die andere Seite wei. Jedem Spieler wird eine Farbe zugewiesen.

-3-

-4Zu Beginn wird das Spielfeld in folgender Weise vorbereitet: Die mittleren vier Felder (D4,E4,D5,E5) werden nach1 nebenstehendem Muster besetzt und der Startspieler, derjenige der den ersten Zug vornimmt, wird bestimmt. Aus historischen Grnden wird normalerweise der Spieler mit der schwarzen Farbe als Startspieler erklrt.

Es wird abwechselnd gezogen. Der aktive Spieler (der Spieler, der am Zug ist) setzt einen Spielstein in seiner Farbe auf ein leeres Feld, das horizontal, vertikal oder diagonal an ein bereits besetztes Feld grenzt. Die Farbe des angrenzenden Spielsteins spielt hierbei keine Rolle. Auerdem muss es, damit der Zug gltig ist, zum Umdrehen mindestens eines gegnerischen Steins kommen. Zum Umdrehen eines gegnerischen Steins kommt es immer dann, wenn zwischen dem neu gelegten Stein und einem oder mehreren bereits liegenden Stein(en) der selben Farbe ausschlielich Steine der anderen Farbe liegen. Dazwischen bedeutet in einer geraden Linie, die horizontal, vertikal oder diagonal verlaufen kann, ohne dass ein Stein der eigenen Farbe vorkommt. Ist ein solch gltiger Zug nicht mglich, muss der Spieler aussetzen und der andere Spieler ist am Zug.

Ziel des Spiels ist es, so viele Steine in seiner Farbe auf dem Feld liegen zu haben wie mglich. Das Spiel endet, wenn das komplette Spielfeld besetzt ist oder beide Spieler keinen gltigen Zug mehr vornehmen knnen.

2.2 Beispiele fr Spielsituationen2

Wei setzt auf D3 einen neuen

Stein und erhlt dadurch die vertikale und diagonale Reihe dazu (E4,D4,D5).1 http://de.wikipedia.org/wiki/Othello_%28Spiel%29 (20.03.2012) 2 http://de.wikipedia.org/wiki/Othello_%28Spiel%29 (20.03.2012)

-4-

-5In der folgenden Spielsituation ist Wei am Zug. Da aber alle noch mglichen Spielzge dazu fhren, dass kein gegnerischer Stein umgedreht wird, muss Wei seinen Zug aussetzen und Schwarz ist am Zug.

3

In dem Fall, dass auch Schwarz wiederum nicht gltig

setzen kann, wre das Spiel an diesem Punkt vorbei, und es wrde die Auswertung folgen. Angenommen, dies wre die endgltige Situation, htte Schwarz 16 Punkte und somit gegen Wei (15 Punkte) gewonnen.

3 Der ServerDieses Kapitel stellt den Hauptteil der Arbeit dar und wird sich mit der serverseitigen Realisierung des Wettbewerbssystems beschftigen. Das Prinzip des Servers hat man sich folgenderweise vorzustellen: Die Teilnehmer (Clients) des Othelloturniers mssen sich beim Server anmelden. Dieser nimmt die Teilnehmer in einer vom Spielleiter vorgegebenen Zeit an und trgt sie mit Name und sonstigen zur Identifizierung ntigen Daten (z.B. E-Mail Adresse) in seine Liste ein. Nachdem die Zeit zur Anmeldung abgelaufen ist, nimmt der Server keine weiteren Teilnehmer mehr an und kmmert sich im nchsten Schritt um die Austragung des Wettbewerbs. Der Wettbewerb soll so gestaltet sein, dass jeder gegen jeden zwei Mal antritt (Farbwechsel Wechsel des Startspielers) und der Gewinner durch die Anzahl der gewonnen, verlorenen oder unentschieden gespielten Spiele ermittelt wird. Der Server hat hierbei die Aufgabe dafr zu sorgen, dass die Kommunikation mit den Teilnehmern funktioniert und die Spielregeln eingehalten werden. Dazu muss der Server die Regeln des Spiels genauso gut kennen wie die Teilnehmer. Abschlieend ist der Server dafr zustndig die Spielergebnisse zu notieren und fr die anschlieende Auswertung bzw. Archivierung zu speichern. Zur Bewltigung dieser Aufgaben wird der Server in entsprechende Aufgabenbereiche unterteilt. Im Zuge der Umsetzung der Aufgabenbereiche werden3 http://de.wikipedia.org/wiki/Othello_%28Spiel%29 (20.03.2012)

-5-

-6Hilfsklassen und Multithreading notwendig. Im Folgenden werde ich mglichst chronologisch die Umsetzung der genannten Aufgabenbereiche erlutern.

3.1 Die AnmeldungDieses Kapitel wird sich mit dem Weg vom Client zum Server befassen. Zum einen wird der direkte Weg ber eine TCP/IP Verbindung behandelt. Andererseits wird auf die Mglichkeit eingegangen, alle relevanten Server im Netzwerk mit Hilfe eines Broadcasts automatisiert zu finden.

3.1.1 Der direkte Weg zum ServerUm die Clients annehmen zu knnen, muss zunchst der Server initialisiert und auf das Annehmen vorbereitet werden. Dies wird durch folgenden Programmcode erreicht:public void startAcceptClients(String ip, int port) throws IOException{ stopAcceptClients(); server=new ServerSocket(); server.setSoTimeout(5000); server.bind(new InetSocketAddress(ip,port)); acceptthread=new AcceptThread(); } public void stopAcceptClients(){ if(acceptthread!=null){ acceptthread.stop(); acceptthread=null; } } private class AcceptThread{ volatile boolean run=false; Thread t; public AcceptThread(){ run=true;

-6-

-7t= new Thread(new Runnable(){ @Override public void run() { while(run){ try { Socket client = server.accept(); } catch (IOException e) { e.printStackTrace(); } } }}); t.start(); } public void stop(){ run=false; t=null; } }

Zunchst wird die Methode startAcceptClients(String ip, int port) aufgerufen, die den ServerSocket erzeugt und an die mitgegebene IP-Adresse und den Port bindet. stopAcceptClients(); wird aufgerufen um zu verhindern, dass ein neuer Thread erstellt wird, ohne dass ein potentiell noch vorhandener AcceptThread sachgem beendet wurde und unter Umstnden ewig weiterlaufen wrde. Die eigentliche Annahme geschieht innerhalb von AcceptThread solange dieser Thread nicht wieder gestoppt wird werden hier die Clients mit server.accept(); angenommen. Da diese Methode allerdings blockiert, bis ein Client angenommen wurde, muss dem ServerSocket ein Timeout zugewiesen werden, welches dafr sorgt, dass der Versuch, einen neuen Client anzunehmen, alle 5 Sekunden gestoppt wird. Wichtig in dem Thread ist, dass der boolean run als volatile bezeichnet wird. Da diese Variable regelt, wie lange der Thread lebendig ist und von zwei oder mehreren Threads verwendet wird, muss hierdurch erwirkt werden, dass alle Threads von mglichen nderungen an der Variable informiert werden4.

4 Thomas Knneth 2011, S.151 und Christian Ullenboom 2012, 11.7 Client-Server-Kommunikation

-7-

-8-

3.1.2 Mit dem Broadcast zum ServerDie Idee hinter einem Broadcast ist es, alle erreichbaren Computer zu befragen, ob die gesuchte Funktionalitt dort zur Verfgung steht. Dazu wird ein UDP-Paket an alle Computer innerhalb des lokalen Netzwerks gesendet. Dieses Paket enthlt Informationen darber, was der Client, der dieses Paket versendet, wissen mchte und von wem er diese Information bekommen will. Wenn ein passender Server dieses Paket empfngt stellt er dem Client die geforderten Informationen zur Verfgung. Die folgende Grafik soll dies noch einmal verdeutlichen:

Im Detail betrachtet muss in Java ein DatagramPacket und ein DatagramSocket erzeugt werden. Das DatagramSocket ist fr den Versand des UDP-Paketes verantwortlich, sowie fr den Empfang der mglichen Antworten. Damit aus dem ganzen ein Broadcast -8-

-9wird, ist es notwendigDatagramSocket.setBroadcast(true);

aufzurufen und als IP-

Adresse die 255.255.255.255 anzugeben. Jetzt wird das Paket an alle empfangsfhigen Computer im Netzwerk gesendet. Dieses Verfahren ist als Limited Broadcast bekannt. In dem folgenden Quellcode wird allerdings auf den Directed Broadcast zurckgegriffen, der etwas mehr Kontrolle erlaubt. Da es auch innerhalb des erreichbaren Netzes Unterteilungen gibt, kann somit eine genaue Ansteuerung eines dieser Unternetze erzielt werden. Der einzige Unterschied zum Limited Broadcast liegt bei der IP-Adresse. Diese wird aus einer Kombination des Zielnetzes und der Netzmaske gebildet. Sei die eigene IP-Adresse 192.168.100.102 und die Netzmaske 255.255.255.0 so ist die Broadcast IP-Adresse 192.168.100.255. Das heit alle Stellen der eigenen IP werden bernommen, wenn die Netzmaske an dieser Stelle den Wert 255 hat ansonsten wird diese Stelle der Broadcast IP-Adresse mit 255 gefllt 5. Die Adresse wird durch die Kombination aus Zielnetz und dem Setzen aller Hostbits auf 1 angegeben6 (Wikipedia - Broadcast).

Damit der Server, der das Paket empfangen soll wei, dass dieses Paket von einem Othello Client stammt, wird dem Paket als Datenteil z.B ein Text (Ich bin es Othello) hinzugefgt.

Sobald der Server das Paket angenommen und als relevant erkannt hat, schickt dieser ein neues Paket zurck an den Client, sodass dieser, wie auch der Server, berDatagramPacket.getAddress()

und

DatagramPacket.getPort()

die

notwendigen

Verbindungsdaten erfragen kann. Auf diesem Weg muss ausschlielich der Port bekannt sein, an den der Broadcast gesendet wird, um alle Server zu finden, die in Frage kommen, um sich mit ihnen zu verbinden. In Quelltext sieht das ganze dann wie folgt aus (Fortsetzung des Textteils ab S.17):

Serverseite:5 aus diesem Grund kann auch kein Rechner eine IP mit einer 255 haben 6 http://de.wikipedia.org/wiki/Broadcast (20.03.2012)

-9-

- 10 private DatagramSocket socket private int wird private Server server = null; // interne Serverinstanz = null; // Serverinfos listeners = new port = null; // Socket fr die Datagramme = 0; // Der Port, der verwendet

private DatagramPacket serverInfo private Vector

Vector(1,1); // FindServersListeners verwalten private int BUFFERSIZE = 1024;

public int getPort() { return port; } public FindServer(int port,int Bufsize,final String stdserverinfo)throws IllegalArgumentException, SocketException{ if (port < 1 || port > 65535){ throw new IllegalArgumentException ("Port number is out of range!");} this.port=port; try { socket = new DatagramSocket (port); // zum Testen, ob der Port geht socket.close(); setServerInfo (stdserverinfo); // StandardServerInfo startServer(); } catch (SocketException e) { throw new SocketException ("Can't bind to specified Socket!"); } this.BUFFERSIZE=Bufsize; } /** * Servernachricht setzen. * */ public void setServerInfo (String str) {

- 10 -

- 11 -

if (str==null) str=""; byte buf [] = str.getBytes(); if (serverInfo!=null) { synchronized (serverInfo) { serverInfo = new DatagramPacket (buf, buf.length); } } else } { serverInfo = new DatagramPacket (buf, buf.length); }

/** * Den Server starten. * */ public void startServer () {

if (server!=null) return; // Einfach ignorieren try { socket = new DatagramSocket(port); } catch (SocketException e) { } server = new Server(); server.start(); } /** * Den Server stoppen. * */ public void stopServer () {

if (server==null) return; // Einfach ignorieren socket.close(); server=null; socket=null; } /**

- 11 -

- 12 * Testen, ob ein Server l&uft. * */ public boolean isServerRunning () { return server!=null; } public void addFindServerListener(FindServersListener c){ listeners.add(c); }

/** * Interne Klasse Server dient zum Beantworten von Anfragen der Clients. */ private class Server extends Thread { public void run () { while...

Recommended

View more >